子类重写父类方法需满足三相同(方法名、参数列表、返回类型)、两不能(访问权限不更严格、不抛出新检查异常)和一建议(加@override注解),且前提为父类方法可继承覆盖;常见策略包括完全替换、前置/后置增强及条件性委托。

子类重写父类方法,核心是用 @Override 注解 + 相同方法签名(名称、参数列表、返回类型),同时满足访问权限不更严格、不抛出新检查异常等规则。关键不是“能不能写”,而是“怎么写才正确、安全、可维护”。
重写的前提:方法必须可被继承和覆盖
以下情况无法重写:
- 父类方法被声明为 private(仅本类可见,子类根本看不到)
- 父类方法被声明为 final(明确禁止重写)
- 父类方法是 static(属于类,不是实例行为;子类“隐藏”而非“重写”)
- 父类方法在不同包中且为 default(包私有) 访问级别,而子类不在同一包内
重写的语法要点:三相同 + 两不能 + 一建议
三相同:方法名、参数列表(类型、个数、顺序)、返回类型(或其子类型,支持协变返回)必须与父类一致。
两不能:子类方法的访问修饰符不能比父类更严格(如父类是 protected,子类不能用 private);不能抛出比父类方法更多或更宽泛的检查异常(可以抛出更少、更具体的,或不抛异常)。
一建议:务必加上 @Override 注解——编译器会帮你检查是否真正在重写,避免拼写错误或签名不符导致“意外重载”而非重写。
重写时如何实现特定逻辑?常见策略
重写不是从零写,而是基于父类行为做扩展、修正或替换:
- 完全替换:忽略父类逻辑,写全新实现(适用于父类方法不适用当前子类场景)
- 前置增强:先执行子类特有逻辑(如日志、校验),再用 super.methodName() 调用父类实现
- 后置增强:先调用 super.methodName(),再追加子类逻辑(如结果处理、缓存更新)
- 条件性委托:根据子类状态决定是否调用父类,或调用不同分支(如 if-else 中部分走父类,部分走自定义)
一个典型例子:动物叫声的差异化实现
父类定义通用行为框架,子类按需重写:
class Animal {
public void makeSound() {
System.out.println("Animal makes a sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Dog barks: Woof!"); // 完全替换
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Cat meows before sounding...");
super.makeSound(); // 前置增强 + 复用父类
System.out.println("...and purrs after.");
}
}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











