复用代码是 Java 众多引人注目的功能之一。但是想要成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。
7.1 组合语法
惰性初始化
7.2 继承语法
7.2.1 初始化基类
基类如果没有默认的无参构造器,必须使用关键字 super 显式地编写调用基类构造器的语句;
7.3 代理
Java 并没有提供对它的直接支持。
“这代理不就是创建一个代理类,组合一下?”
7.4 结合使用组合和继承
7.4.1 确保正确清理
7.4.2 名称屏蔽
7.5 在组合和继承之间选择
is-a 继承
has-a 组合
7.6 protected 关键字
:::warning 上一节 的问题:
哪些场景下需要使用 protected 修饰符呢?
就类的用户而言,这是private的,但是对于任何继承于此类的子类或者位于用一个包内的类而言,它却是可以访问的。
:::
7.7 向上转型
“接收基类作为参数的方法,传入一个子类也是可以滴。”
7.7.1 为什么称为向上转型
7.7.2 再论组合与继承
慎用继承,我真的需要向上转型吗?
7.8 final 关键字
这是无法改变的,目的是为了 设计 或 效率;
7.8.1 final 数据
基本数据类型,一个既是static又是final的域只占据一段不能改变的存储空间;
对于 基本类型,final 使数值恒定不变;
对于 对象引用,final 使引用恒定不变;数组也是对象!
空白final:必须在域的定义处或者每个构造器中用表达式对final进行赋值;
final 参数:无法在方法中更改参数引用所指向的对象;
7.8.2 final 方法
锁定方法,以防止任何继承类修改它的含义;
7.8.3 final 类
无法被继承的类
7.8.4 有关 final 的忠告
7.9 初始化及类的加载
7.9.1 继承与初始化
:::warning 请证明加载类的动作仅发生一次。证明该类的第一个实体的创建或者对 static 成员的访问都有可能引起加载 :::
7.10 总结
在设计一个系统时,目标应该是找到或创建某些类,其中每个类都有具体的用途,而且既不会太大,也不会太小。如果你的设计变得过于复杂,通过将现有类拆分成更小的部分而添加更多的对象,通常会有所帮助。