复用代码是Java众多引人注目的功能之一。但仅仅能复制代码并对之加以改变是不够的,还需要做更多的事情。

复用代码的两种形式:

1.组合,新类中产生现有类对象

2.继承,用现有类型创建新类型

7.1组合语法

7.2继承语法

7.2.1初始化基类

当创建了一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的(Java会自动在导出类构造器里插入对基类构造器的调用,基类只含带参构造需要自己用super调用,不可省略),二者区别在于继承时基类的子对象包装在导出类对象内部,而直接创建来与外部。

7.3代理

代理:第三种关系,Java没有对它的直接支持,继承和组合之间中庸之道。

实现代理:把一个成员对象放在代理类中(就像组合),同时在新类中暴露了这个对象的所有方法(就像继承)。

7.4结合使用组合和继承

7.4.1确保正确清理

除了内存之外,不能依赖垃圾回收器去做任何事。如果需要清理,最好是编写自己的清理方法(子类清理方法和父类清理方法调用顺序按照创建反序来执行),在该对象使用结束之后,用finally{}子句调用清理方法,不要使用finalize()。

7.4.2名称屏蔽

子类可以对基类方法进行覆盖,重载。利用@override注解可以防止在想覆盖时意外写成了重载

7.5在组合与基础之间选择

继承:is-a

组合:has-a

7.6protected关键字

 提供子类和同包的访问权限

7.7向上转型

为新类型提供方法,并不是继承技术中最重要的方面,最重要的是新类和基类之间的关系,这种关系可以用”新类是现有类的一种类型“来表示。

7.7.1为什么称为向上转型

7.7.2再论如何选择组合与继承

问一问自己是否需要从新类向基类转型,需要用继承,否则尽可能不要用

7.8final关键字

参照 Java final 关键字 & 参数传递特点

7.9初始化及类的加载

Java中类的加载在初次使用时发生,通常是创建对象或者访问static方法(构造器也算是static方法,只是隐式的)。

7.9.1继承与初始化

 参照 Java 类加载、调用构造器、执行方法的过程

7.10总结

组合和继承都可以产生新类型。组合一般是把现有类型作为新类型实现的一部分加以复用,而继承是复用已有类型的接口。