子类修改父类行为的核心是方法重写,需满足“三同一返回”、访问权限不更严格、异常范围不扩大;可用super复用父类逻辑;final和private方法不可重写;abstract方法强制子类实现。

子类修改父类行为,核心是通过方法重写(Override)实现的——不是覆盖、不是删除,而是“在继承基础上提供新实现”。关键在于明确哪些能改、怎么改才安全有效。
重写必须满足“三同一返回”
子类重写父类方法,需同时满足:方法名相同、参数列表相同、返回类型兼容(协变返回允许子类型)。访问权限不能更严格(如父类是 public,子类不能改成 protected),且不能抛出比父类更宽泛的检查异常。
- 正确示例:public String toString() 在子类中重写为 public String toString()
- 错误示例:把 protected void init() 改成 private void init() —— 编译不通过
- 注意:@Override 注解不是必需,但强烈建议加上,帮助编译器校验是否真正在重写
用 super 调用父类原始逻辑
很多场景不需要完全抛弃父类行为,而是“在其基础上增强”。这时用 super.方法名() 显式复用父类实现,避免重复造轮子,也利于维护。
- 比如子类 save() 先调用 super.save() 保存数据,再发通知或更新缓存
- 构造器中若需初始化父类状态,必须用 super(...) 且必须是第一行语句
- 慎用 super 访问被子类隐藏的字段(非推荐做法),优先通过方法间接访问
final 方法和 private 方法不能被重写
父类中标记为 final 的方法,设计意图就是禁止子类修改其行为;private 方法因不具备继承性,子类中同名方法只是新定义,和重写无关。
立即学习“Java免费学习笔记(深入)”;
- 如果发现子类里写了看似重写的 private 方法,实际是独立方法,多态调用时不会生效
- 想阻止重写又不想用 final?可将类本身声明为 final,彻底禁止继承
- 接口默认方法(default)可以被实现类重写,静态方法则不能
抽象方法强制子类定制行为
父类用 abstract 声明方法,不提供实现,等于给子类划出“必须填空”的契约。这是最清晰的“按需修改”机制——不是可选,而是必须实现。
- 适合模板方法模式:父类定义算法骨架(含 final 方法),把可变部分留给抽象方法由子类实现
- 抽象类中可混用具体方法与抽象方法,兼顾复用性与扩展性
- 接口中的抽象方法(Java 8+)同样要求实现类提供具体行为,但不可含构造逻辑


















