复用代码是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总结
组合和继承都可以产生新类型。组合一般是把现有类型作为新类型实现的一部分加以复用,而继承是复用已有类型的接口。