继承表示“是一个”(is-a)关系,子类获得父类非私有成员并遵守里氏替换原则;组合表示“有一个”(has-a)关系,通过字段复用行为,更灵活、低耦合、易测试。
继承关系在Java里意味着什么
继承表示“是一个”(is-a)关系,子类天然获得父类的非私有成员,同时承担父类的契约责任。Java中用 extends 实现单继承,且子类必须满足里氏替换原则——任何父类能出现的地方,子类也必须能安全替代。
常见错误是把“能用”当成“该用”:比如为复用几个方法就让 Car 继承 Engine,这违反常识(汽车不是引擎),运行时可能触发 ClassCastException 或逻辑错位。
- 父类
protected成员可被子类直接访问,但包外不可见 -
final类不能被继承,final方法不能被重写 - 构造器不继承,但子类构造器默认隐式调用
super(),若父类无无参构造器,必须显式写super(...)
组合关系更贴近真实建模
组合表达“有一个”(has-a)关系,通过在类中声明其他类的实例变量来复用行为。它不产生强耦合,也不要求语义上存在类型兼容性。
例如 Order 类持有 PaymentProcessor 引用,而不是继承它——支付方式可以随时切换(微信、支付宝、MockProcessor),而继承会把实现细节锁死在类型系统里。
立即学习“Java免费学习笔记(深入)”;