继承提升复用性的关键是精准识别共性、合理抽象父类并严格遵循“is-a”语义;需提取多子类共享的属性与行为,避免has-a误用,控制访问权限,预留扩展点。

设计继承关系提升代码复用性,核心是精准识别共性、合理抽象父类,并严格遵循“is-a”语义。不是所有相似都适合继承,关键在于逻辑归属是否自然。
从重复代码中识别可提取的共性
当多个类存在相同属性(如 name、age)和行为(如 showInfo()、eat()),这些就是可抽取的共性。例如 Student 和 Teacher 都有姓名、年龄、展示信息功能,就适合共用一个 Person 父类。
- 只提取真正被多个子类共享的成员,避免把临时相似当成本质共性
- 属性应为业务上确实属于“同一类事物”的特征,比如“商品编号”“价格”可归入 Product,但“订单号”“收货地址”属于 Order,不能强行塞进 Product
- 方法逻辑结构一致(如都需校验、都需日志),才值得上提到父类
按 is-a 关系建模,拒绝 has-a 误用
继承表达的是“是一种”的关系。比如 Graduate 是一种 Student,BookProduct 是一种 Product;但 Order 并不是一种 Product(订单包含商品,是 has-a),此时该用组合而非继承。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 错误示例:
class Order extends Product—— 违背语义,导致逻辑混乱、后续扩展困难 - 正确做法:Order 类中声明
private List<product> items</product>,通过组合复用 Product 的能力 - 判断口诀:能用“XX 是一种 YY”自然说出来,且符合业务常识,才考虑继承
控制访问权限,兼顾复用与封装
父类中需被子类直接使用的成员,不应设为 private。推荐使用 protected 或包级默认(无修饰符),既保证子类可访问,又防止外部随意修改。
-
private double score;在父类 Student 中不可被子类直接读写,必须配套提供getScore()/setScore() - 若子类需在自己的方法中修改 score,且该字段确属学生体系内部状态,可改为
protected double score; - 构造器不被继承,子类需显式调用
super(...)初始化父类部分,确保对象创建时共性数据完整
预留扩展点,支持子类差异化实现
共性上提,个性保留。父类可用 模板方法模式 定义流程骨架,把可变环节留给子类重写。
- 例如父类 Student 定义
public final void study() { prepare(); doStudy(); review(); } - 其中
doStudy()设为protected abstract,由 Pupil 和 Graduate 分别实现“学小学数学”或“学高等数学” - 这样既统一了学习流程(复用),又允许行为细节不同(可扩展)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










