本文最后更新于80 天前,其中的信息可能已经过时,如有错误请发送邮件到3082654005@qq.com
@Override 是 Java 中的一个注解(Annotation),主要用于标记某个方法是重写(覆盖)了父类的方法,或实现了接口中的抽象方法。它的核心作用是让编译器帮助我们检查 “重写” 是否正确,避免因手误等导致的逻辑错误。
主要功能:编译时校验
当一个方法被 @Override 标注时,编译器会自动检查以下规则:
- 该方法是否真的存在于父类(或实现的接口)中;
- 方法名、参数列表(类型、顺序、数量)是否与父类 / 接口中的方法完全一致;
- 返回值类型是否符合 “协变返回类型” 规则(即子类返回值可以是父类返回值的子类)。
如果不符合上述规则,编译器会直接报错,提前发现错误(而不是等到运行时才出问题)。
适用场景
- 重写父类的方法
当子类需要修改父类中某个方法的实现时,用@Override标注,明确这是 “重写行为”。示例:java运行class Parent { public void sayHello() { System.out.println("Parent: Hello"); } } class Child extends Parent { // 标注@Override,表明这是重写父类的sayHello() @Override public void sayHello() { // 方法名、参数列表与父类完全一致 System.out.println("Child: Hello"); } } - 实现接口的抽象方法
在 Java 7 及之后,@Override也可以用于标注接口实现类中对抽象方法的实现(Java 6 及之前仅支持标注父类方法的重写)。示例:java运行interface UserService { void saveUser(); } class UserServiceImpl implements UserService { // 标注@Override,表明这是实现接口的saveUser() @Override public void saveUser() { // 方法名、参数列表与接口完全一致 // 实现逻辑 } }
为什么要用 @Override?
- 避免低级错误:比如不小心写错方法名(如把
sayHello()写成sayHi())、参数列表不匹配(如少写一个参数),编译器会直接报错提醒。反例(错误情况):java运行class Child extends Parent { // 错误:方法名拼写错误(应为sayHello),但未加@Override时编译器不会报错 // 实际会被当成子类新增的方法,而非重写父类方法 public void sayHelloOops() { System.out.println("Child: Hello"); } }
若加上@Override,编译器会立即提示 “方法未在父类中找到”,避免逻辑错误。 - 提高代码可读性:明确告诉其他开发者 “这个方法是重写的”,便于理解类之间的继承 / 实现关系。
注意点
@Override仅用于方法,不能标注类、属性等;- 父类的
private方法不能被重写(子类无法访问),若用@Override标注会报错; - 父类的
final方法不能被重写(final修饰的方法不可变),用@Override标注会报错。
总结:@Override 是一个 “辅助性注解”,本身不影响程序运行,但能通过编译器校验减少错误,同时增强代码的可读性和可维护性,建议重写方法时都加上。


