文档章节

《疯狂java讲义2》读书笔记——继承与组合

我的夏幸运
 我的夏幸运
发布于 2016/11/11 20:01
字数 918
阅读 10
收藏 0

继承与组合 

        继承是实现类重用的重要手段,但继承带来一个最大的坏处:破坏封装。组合也是实现类重用的重要方式,而采用组合方式来实现类重用则能提供更好的封装性。

使用继承的注意点

        子类扩展父类时,子类可以从父类继承得到Field和方法,如果访问权限允许,子类可以直接访问父类的Field和方法,相当于子类可以直接复用父类的Field和方法。

        封装:每个类都应该封装它内部信息和实现细节,而只暴露必要的方法给其他类使用。

        为了保证父类的封装性,设计父类应该遵循如下规则:

        》尽量隐藏父类的内部数据,尽量把父类的所有Field都设置成private访问类型,不要让子类直接访问父类的Field。

        .》不要让子类可以随意访问,修改父类的方法。父类中那些仅为辅助其他的工具方法,应该使用private修饰;如果父类中的方法需要被外部类调用,则必须以public修饰,但又不希望子类重写该方法,使用final修饰;如果希望父类的某个方法被子类重写,但不希望其他类自由访问,则使用protected修饰。

        》尽量不要在父类构造器中来调用将要被子类重写的方法。

class Base
{
	public Base() 
	{
		test();
	}
	public void test()
	{
		System.out.println("将被子类重写的方法");
	}
}
public class Sub extends Base
{
	private String name;
	public void test()
	{
		System.out.println("子类重写父类的方法,"+"其name字符串的长度"+name.length());
	}
	public static void main(String[]args)
	{
		//下面代码会引发空指针异常
		Sub s= new Sub();
	}
}

        当系统识图创建Sub对象时,同样会先执行其父类构造器如果父类构造器调用了被其子类重写的方法,则变成调用被子类重写后的方法。当创建Sub对象时,会先执行Base类中的Base构造器,而Base构造器中调用了test方法——并不是调用父类的test方法,而是调用的i之类的test方法,此时Sub对象的nameField是null,因此空指针异常。

        如果想把某些类设置成最终类,即不能被当成父类,则可以使用final修饰;使用private修饰这个类的所有构造器,从而保证子类无法调用该类的构造器,也就无法继承该类。使用private修饰的父类,可以另外提供一个静态方法,用于创建该类的实例。

什么情况下需要从父类派生新的子类呢?

        》子类需要额外增加属性,而不仅仅是属性值的改变。

        》子类需要增加自己独有的行为方式(包括增加新的方法或重写父类的方法)。

利用组合实现复用

        如果需要复用一个类,出了继承外,还可以把该类当成另一个类的组合成分,从而允许新类直接复用该类的public方法。组合是把旧类对象作为新类的Field嵌入,用以实现新类的功能,用户看到的是新类的方法,而不能看到被起嵌入对象的方法。

何时使用继承?组合?

        将一个较为抽象的类改变成能使用与某些特定需求的类使用继承。如果两个类之间有明确的整体,部分的关系,使用组合。

© 著作权归作者所有

我的夏幸运
粉丝 1
博文 7
码字总数 6566
作品 0
运城
程序员
私信 提问
高手问答第 223 期 —— Python 摘下年度编程语言称号,你上车了吗?

OSCHINA 本期高手问答(2019年1月9日 — 2019年1月15日)我们请来了李刚老师@疯狂软件李刚 和大家一起探讨 Python 相关的问题。 李刚,十余年的软件开发从业经验,疯狂软件教育中心教学总监,疯...

局长
01/09
0
0
高手问答第 188 期 — 从 Java 开发说起,聊聊 Java 的现状和未来

OSCHINA 本期高手问答(3 月 7 日 - 3 月 13 日)我们请来了李刚老师@疯狂软件李刚 和大家一起探讨关于 Java 的问题。 李刚,十余年的软件开发从业经验,疯狂软件教育中心教学总监,疯狂 Java...

局长
2018/03/07
11.2K
71
三大java技术牛人齐聚广州传智播客——超强师资,超低价格,超深课程,超真项目

三大java技术牛人齐聚广州传智播客——超强师资,超低价格,超深课程,超真项目 中国的软件教育已经坑害了不少软件工程师苗子,传智播客自成立之日起就立志于改变中国的软件教育。随着传智播...

传智播客java.net培训
2010/03/02
281
1
疯狂java讲义ed3 读书笔记

百度脑图: http://naotu.baidu.com/file/c07a7be593acee73e72451ad1d393f5d?token=ce49cc74688fd5fd 虽然 java 基础看了不下 3 遍了,可是不怎么用 java 写代码 花了几天粗略的看了一下, 算是...

daydaygo
2018/11/08
0
0
读书笔记之《Java并发编程的艺术》-线程池和Executor的子孙们

读书笔记部分内容来源书出版书,版权归本书作者,如有错误,请指正。 欢迎star、fork,读书笔记系列会同步更新 git https://github.com/xuminwlt/j360-jdk module j360-jdk-thread/me.j360....

Hi徐敏
2015/11/11
0
1

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部