子类扩展的核心目标是复用父类能力并精准补充业务逻辑,关键在于加得准、调得稳、扩得活;需明确继承边界、优先复用通用行为、避免构造器中调用可重写方法、合理设计字段与方法、重写时协同super、预留protected钩子。

子类扩展的核心目标是复用父类已有能力,同时精准补充特定业务逻辑。关键不在“加得多”,而在“加得准、调得稳、扩得活”。
明确扩展边界:继承什么、不继承什么
父类应只暴露可安全复用的成员。私有字段(private)无法被子类直接访问,需通过受保护的 getter/setter 或 protected 字段开放;构造器不被继承,子类必须显式调用 super() 初始化父类状态。
- 优先把通用行为(如日志记录、基础校验、连接初始化)放在父类
- 避免在父类构造器中调用可能被子类重写的方法——易引发空指针或未初始化异常
- 若父类字段仅用于内部逻辑,不要设为 protected;宁可用包级访问+同包子类,也不贸然开放
新增功能:定义子类专属行为与状态
扩展不只是加方法,更是补全语义。比如 Person 是父类,Student 子类除继承姓名年龄外,还需学号、专业、选课等特有属性和操作。
- 新增字段建议用 private 修饰,并提供完整 getter/setter
- 新增方法命名要体现职责,如 enrollCourse() 比 doSomething() 更清晰
- 若新功能依赖父类状态(如用 name 打印学生证),直接使用继承来的字段,无需重复定义
增强已有行为:重写 + super 协同工作
重写不是推翻,而是叠加。例如 Animal.makeSound() 输出通用提示,Dog 子类重写时先调用 super.makeSound(),再追加“汪汪叫”,既保留共性又突出个性。
- 务必添加 @Override 注解——编译器会校验签名是否匹配,防止拼写错误导致隐式新建方法
- 重写逻辑中,super.xxx() 应放在合理位置:前置执行父类校验,后置追加子类动作
- 若父类方法声明为 final,则不可重写,此时应考虑组合或接口实现替代方案
预留扩展点:为未来留出钩子
好的父类设计会主动预留可插拔入口。例如在模板方法中定义 protected void onInit() { },子类选择性覆盖,不影响主流程。
- 将可变逻辑抽象为 protected 空方法或默认空实现的方法
- 避免在父类中硬编码具体实现,改用策略接口或函数式参数(如 Consumer
)接收子类定制逻辑 - 配合注释说明该钩子用途,如 “// 子类可在此注入初始化后处理逻辑”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











