核心是区分“is-a”与“has-a”关系:优先用组合替代非语义继承,以接口+default方法提取共性行为,按维度拆分抽象类职责,并禁用父类越界逻辑。

Java 中多层级继承容易导致代码臃肿,核心在于类职责不清、复用方式错位、逻辑分散。解决的关键不是“压平继承链”,而是重构设计意图——把“谁是谁”(is-a)和“谁有什么”(has-a)分开处理。
优先用组合替代深层继承
当子类仅为了复用父类某部分能力而继承(比如 Vehicle 继承 Machine 再继承 Device),实际关系并不符合“是”的语义,就该拆掉继承链,改用组合。
- 把可变行为抽象为接口(如 Engine、BrakingSystem),让具体类持有其实例
- 构造时注入依赖,便于单元测试和运行时替换(比如切换电动/燃油引擎)
- 避免父类膨胀:不再需要在顶层加一堆
if (type == X)分支来适配不同子类
用接口 + 默认方法提取共性行为
多个不相关类有相同功能(如日志、序列化、校验),不要硬拉一个共同父类,而是定义接口并提供默认实现。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- Java 8+ 接口支持
default方法,适合封装通用逻辑 - 例如
Loggable接口带default void log(String msg),Cat、Order、Report 各自实现即可 - 既避免继承污染,又保持调用一致性,还支持多实现
拆分抽象类,按维度收敛职责
如果必须保留继承结构,就按关注点切分抽象层,每层只负责一类变化。
立即学习“Java免费学习笔记(深入)”;
- 比如动物系统:顶层
Animal(生命行为)→ 中层Mammal(哺乳特征)→ 底层Dog(犬类行为) - 禁止在
Mammal里塞飞行逻辑或数据库操作——那属于其他维度 - 每层抽象类只暴露本层契约,不越界承担下层细节
用内部类模拟有限多重继承(慎用)
当确实需要融合两个不相关的类行为(如同时具备“可存储”和“可渲染”),且无法用接口统一时,可用成员内部类桥接。
- 外部类继承 A,内部类继承 B,并对外提供 B 的能力代理方法
- 注意:内部类应仅用于能力补充,不可用于构建业务主干逻辑
- 优先考虑策略模式或委托模式替代,内部类易增加理解成本

















