复用代码是 Java 众多引人注目的功能之一。但是想要成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。

7.1 组合语法

惰性初始化

7.2 继承语法

7.2.1 初始化基类

基类如果没有默认的无参构造器,必须使用关键字 super 显式地编写调用基类构造器的语句;

7.3 代理

Java 并没有提供对它的直接支持。

“这代理不就是创建一个代理类,组合一下?”

7.4 结合使用组合和继承

7.4.1 确保正确清理

7.4.2 名称屏蔽

@Override

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 总结

在设计一个系统时,目标应该是找到或创建某些类,其中每个类都有具体的用途,而且既不会太大,也不会太小。如果你的设计变得过于复杂,通过将现有类拆分成更小的部分而添加更多的对象,通常会有所帮助。