@override 用于校验和声明方法重写,真正覆盖需满足:签名一致、返回类型兼容、访问权限不更严、父类方法非 final/static/private。

用 @Override 正确重写父类方法,核心不是“加注解就覆盖”,而是先满足重写规则,再用注解来校验和声明。它本身不改变行为,但能帮你避开常见错误。
必须满足的重写条件
只有同时符合以下几点,Java 才真正执行方法覆盖(运行时多态):
- 方法名、参数类型、个数、顺序必须和父类方法完全一致
- 返回类型相同,或为父类返回类型的子类(比如父类返回
Object,子类可返回String) - 访问修饰符不能比父类更严格(如父类是
protected,子类不能是private;可以是protected或public) - 父类方法不能是
final、static或private—— 这三类方法无法被重写
@Override 注解的实际作用
它是一个“编译期安全带”和“代码说明书”:
- 如果加了 @Override,但方法签名和父类不匹配(比如拼错名、少一个参数、返回类型不兼容),编译器立刻报错,而不是静默创建一个新方法
- 让其他开发者一眼看出:这个方法不是新增逻辑,而是有意替换父类行为
- 不加也能重写成功,但容易埋下隐患——比如你以为重写了
toString(),结果写成toStirng(),没注解就编译通过,运行时根本不会调用
正确写法与典型错误对比
假设父类有:
public void move() { System.out.println("Animal moves"); }
}
✅ 正确重写(签名一致 + 注解 + 合法修饰符):
class Bird extends Animal {@Override
public void move() { System.out.println("Bird flies"); }
}
❌ 常见错误示例:
-
@Override public void move(int speed)→ 参数变了,编译失败 -
@Override private void move()→ 访问权限更严,编译失败 -
@Override public static void move()→ 静态方法不能重写,编译失败 - 删掉
@Override,但把move()写成moove()→ 编译通过,但实际是新增方法,无覆盖效果
验证是否真的覆盖成功
看运行时多态表现,而不是只看代码:
Animal a = new Bird();a.move(); // 输出 "Bird flies",说明覆盖生效
如果输出的是 "Animal moves",说明要么没重写、要么重写条件不满足、要么用了错误引用类型(比如声明为 Bird b = new Bird() 再调用,看不出多态)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











