Java方法重写必须满足四个条件:方法签名完全一致(含方法名、参数类型及顺序,泛型擦除后等价)、返回类型协变(引用类型可缩小,基本类型和void须严格相同)、访问权限不能更严格(如父类protected,子类可用protected或public)、检查型异常不能扩大(只能抛出父类异常的子类或不抛出);static、final、private方法不可重写。

Java 中方法重写必须满足四个核心条件,缺一不可,否则编译失败或变成重载而非重写。
方法签名完全一致
子类方法名、参数个数、每个参数的类型(原始类型与包装类不兼容)、参数顺序,必须和父类被重写方法一模一样。注意:
- 参数名可以不同,不影响重写
- 泛型不参与签名,但擦除后类型必须等价(如
List<String>和ArrayList<String>擦除后不等价,不能互为重写) -
void print(int x)和void print(Integer x)是重载,不是重写
返回类型满足协变规则
返回类型需相同,或为父类返回类型的子类型(仅限引用类型):
- 允许:父类返回
Animal,子类返回Dog;父类返回List,子类返回ArrayList - 不允许:父类返回
String,子类返回Object(扩大);父类返回int,子类返回Integer(基本类型不支持协变) -
void和基本类型必须严格相同
访问权限不能更严格
子类方法的访问修饰符可见性只能等于或高于父类:
立即学习“Java免费学习笔记(深入)”;
- 父类是
public→ 子类只能是public - 父类是
protected→ 子类可用protected或public - 父类是包级(默认)→ 子类只能在同包内重写,且不能用
private或protected降级 -
private方法不可继承,因此无法重写
异常声明不能扩大范围
子类方法抛出的检查型异常(checked exception)只能是父类异常的子类,或不抛出:
- 父类没声明异常 → 子类只能抛运行时异常(如
NullPointerException),不能抛IOException - 父类抛
IOException→ 子类可抛FileNotFoundException(它是子类),但不能抛Exception - 运行时异常(
RuntimeException及其子类)无限制,可增、删、换
另外,三类方法绝对不可重写:static(属于类,只能隐藏)、final(禁止覆盖)、private(不可见)。所有重写方法都应强制添加 @Override 注解,用于编译期校验和重构安全。


















