Java 代码复用:继承与组合的艺术
在面向对象编程中,代码复用是提升开发效率、降低维护成本的核心手段。Java 中实现代码复用的两种主要方式是继承(Inheritance) 和组合(Composition),二者各有适用场景,理解其差异与原理是写出高质量代码的关键。
代码复用的三种关系
在 UML 设计中,类之间的复用关系主要分为三类,核心区别在于 “依赖强度” 和 “语义关系”:
| 关系类型 | 关键字 | 语义描述 | 示例 |
|---|---|---|---|
| 继承 | extends |
is-a(是一个):子类是父类的特殊类型 | 汽车(Car)是一种交通工具(Vehicle) |
| 组合 | 成员变量 | has-a(有一个):新类包含现有类的对象 | 汽车(Car)有一个发动机(Engine) |
| 依赖 | 方法参数 / 局部变量 | uses-a(使用一个):临时使用其他类 | 汽车(Car)使用汽油(Gasoline) |
继承(Inheritance):is-a 关系
继承是通过 extends 关键字让子类(Subclass)继承父类(Superclass)的属性和方法,从而复用父类代码。其核心是 “特殊化”—— 子类是父类的更具体版本。
继承的核心特性
- 代码复用:子类自动拥有父类的非私有(
public/protected/ 包访问)属性和方法。 - 方法重写(Override):子类可重写父类方法,修改或扩展其行为(需满足 “两同两小一大” 规则:方法名、参数列表相同;返回值、异常范围更小;访问权限更大)。
- 单继承限制:Java 中类仅支持单继承(一个子类只能有一个直接父类),避免 “菱形继承” 导致的歧义。
继承中的构造器调用
子类构造器必须先调用父类构造器,确保父类初始化完成,具体规则:
