java方法重写必须满足方法名、参数列表完全一致,返回类型协变或相同,访问权限不更严格,检查异常不更宽泛,且必须加@override注解以确保编译期校验。

Java 中方法重写必须满足签名一致、权限不缩、异常不扩、返回兼容,且强烈建议加 @Override 注解。它不是语法强制,但缺了容易埋隐患——比如拼错方法名、参数类型写反,编译器不会报错,运行时却调不到子类逻辑。
重写的基本实现条件
子类要真正重写父类方法,必须同时满足以下五点:
- 方法名完全相同
- 参数列表(类型、个数、顺序)完全一致
- 返回值类型相同,或为父类返回类型的子类(即协变返回,如父类返回
Animal,子类可返回Dog) - 访问修饰符不能比父类更严格(
public→ 只能public;protected→ 可protected或public;默认包权限 → 不能是private) - 抛出的检查型异常不能比父类更宽泛(可不抛、可抛父类异常的子类,但不能新增
Exception等更上层异常)
@Override 注解的必要性
这个注解不是摆设,它是编译期安全阀:
- 一旦加了,编译器会逐项校验是否真满足重写规则;不符就直接报错,比如参数类型写成
int而非String,立刻拦截 - 让其他开发者一眼识别这是重写逻辑,而不是新增方法,提升协作效率
- 对接口实现方法也适用(如实现
Runnable.run()),同样触发校验
哪些方法不能被重写
即使写了 @Override,以下情况也会编译失败:
-
private方法:子类根本不可见,谈不上重写 -
final方法:明确禁止子类修改行为 -
static方法:属于类而非实例,子类同名静态方法只是“隐藏”,不是重写 - 构造方法:没有继承关系,自然无法重写
常见错误与规避方式
实际编码中高频踩坑点:
- 把
public void show(String s)错写成public void show(string s)(大小写错误)→ 加@Override后编译直接报错 - 父类方法抛
IOException,子类重写时抛Exception→ 编译失败,应改为不抛或只抛FileNotFoundException等子类 - 父类是
protected,子类写成private→ 违反访问权限规则,编译报错 - 误以为重写
static方法是多态 → 实际是静态绑定,调用取决于引用类型,不是运行时对象类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











