子类重写父类方法本质是同名同参同语义替换行为:方法签名四要素必须一致;返回值需协变;基本类型与包装类不兼容;访问权限不能收窄;编译时异常不能扩大;static/final/private/构造方法不可重写;务必加@override注解。

子类重写父类方法,本质是“在继承基础上替换行为”——不是新增功能,也不是随意改名,而是用同名、同参数、同语义但不同实现的方法,让子类对象调用时自动走自己的逻辑。
方法签名必须完全一致
- 方法名、参数类型、参数顺序、参数个数,四个要素缺一不可。
- 返回值类型需满足协变规则:若父类返回
Number,子类可返回Integer或Long(子类),但不能返回Object(父类)或String(无关类型)。 - 基本类型和包装类不兼容:父类返回
int,子类不能返回Integer;这是两个不同签名,编译直接报错。
访问权限不能收窄
-
public方法只能被public重写; -
protected方法可被protected或public重写,但不能是private或默认(包私有); - 默认(包级私有)方法仅限同包内重写,且不能加
private或protected; -
private方法无法被继承,自然无法重写。
异常与静态特性有硬约束
- 子类重写方法抛出的编译时异常,只能是父类异常的子类或相同类型,不能扩大范围;
-
static方法不能被重写,只能被“隐藏”(子类同名静态方法会屏蔽父类的,但不具多态性); -
final、private、构造方法均不可重写。
务必加上 @Override 注解
- 它不改变运行行为,但能帮你在编译期发现拼写错误、参数类型不匹配、返回值违规等问题;
- 如果父类方法被删除或改名,带注解的子类代码会立刻报错,避免“假覆盖”隐患。
不复杂但容易忽略










