Java 中的代码复用
Java 引人注目的一项特性是代码的重复使用或者再生。
达到这一目标有两种方式。
- 合成 (Composition)
合成是指一个类包含另一个类的实例作为其成员变量,通过调用成员对象的方法来实现复用。
|
|
因为新类由现有类的对象合并而成。我们只是简单地重复利用代码的功能,而不是采用它的形式。
组合的特点:
- 通过成员变量实现
- 一个类"拥有"另一个类的对象
- 体现"包含"或"由…组成"的关系
- 比继承更灵活
- 继承 (Inheritance)
建一个新类,将其作为现有类的一个“类型”。
我们可以原样采取现有类的形式,并在其中加入新代码,同时不会对现有的类产生影响。
Java 通过关键字 extends 在语言级别支持类的复用
|
|
Dog (狗) 是一种动物,它很自然的继承了动物 (Animal) 的接口,并且具有自己的特性 (吼叫)。
继承的特点:
- 子类继承父类的非私有成员 (属性和方法)
- 子类可以重写(override)父类的方法
- 子类可以添加新的属性和方法
- 体现"is-a"关系(子类是父类的一种)
扩展
在面向对象编程中,“is-a"和"has-a"是两种基本的类关系模型,它们决定了类之间应该如何组织和关联。
“is-a"关系(继承关系)
“is-a"关系表示继承关系,即一个类是另一个类的特殊化版本。
“has-a"关系(组合关系)
“has-a"关系表示组合关系,即一个类包含另一个类的实例作为其组成部分。
使用组合还是继承?
“组合优于继承”(Favor composition over inheritance) 是面向对象设计的一个重要原则,因为它提供了更好的封装性和更灵活的代码结构。
设计建议:
- 优先使用组合:Java设计原则建议"组合优于继承”,因为组合更灵活,耦合度更低
- 谨慎使用继承:只有当确实存在"is-a"关系时才使用继承
- 避免深度继承:继承层次不宜过深,通常不超过3层
- 考虑接口:有时使用接口比继承更合适,特别是需要多重"is-a"关系时