@Override注解用于编译器检查方法是否真正重写父类或接口中的方法,防止拼写错误、参数不匹配等;必须用于重写非private非static实例方法或实现接口抽象方法。

在 Java 中,@Override 注解本身不改变方法行为,它的核心作用是**让编译器帮你检查:这个方法是否真的重写了父类(或接口)中的某个方法**。用对了,能提前发现拼写错误、参数不匹配、返回类型不兼容等常见低级错误。
什么时候必须加 @Override?
只要你是**有意重写**父类的非 private、非 static 方法,或者实现接口中的抽象方法,就应加上 @Override。这不是可选项,而是强烈推荐的编码习惯。
- 重写父类的 public/protected 实例方法(含 Object 类的 toString()、equals()、hashCode() 等)
- 实现接口中定义的默认方法(default method)
- 重写父接口中继承来的抽象方法(在子接口或实现类中)
不加 @Override 会有什么风险?
编译器不会报错,但你可能以为自己重写了,实际却只是“新建了一个同名方法”——这叫**方法隐藏(hiding)或重载(overloading)**,而非重写(overriding)。
例如:
立即学习“Java免费学习笔记(深入)”;
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
class Animal { void speak() { System.out.println("sound"); } }
class Dog extends Animal {
// 忘了加 @Override,且把参数写错了
void speak(String msg) { System.out.println("Woof: " + msg); }
}
这里 speak(String) 并未重写 Animal.speak(),而是新增了一个重载方法。调用 new Dog().speak() 仍执行父类逻辑,容易引发逻辑 bug,而编译器完全沉默。
加了 @Override 后,编译器具体校验什么?
编译器会严格比对以下几点,任一不满足就报错:
- 方法名是否与父类/接口中某个方法完全一致
- 参数列表(类型、个数、顺序)是否完全相同
- 返回类型是否协变(即相同,或是其子类型;注意 void 和基本类型不能协变)
- 访问修饰符不能比父类更严格(如父类是 protected,子类不能是 private 或 package-private)
- 不能抛出比父类方法更多或更宽泛的受检异常(checked exception)
常见误用场景及修正
错误1:给 static 方法加 @Overridestatic 方法不能被重写(只能被隐藏),加 @Override 会编译失败。
class A { static void show() {} }
class B extends A { @Override static void show() {} } // ❌ 编译错误
错误2:重写 private 方法
private 方法不可见,子类中同名方法属于新定义,不是重写。
class A { private void init() {} }
class B extends A { @Override void init() {} } // ❌ 编译错误:找不到可重写的方法
错误3:实现接口时漏掉 @Override(虽不报错但易出错)
接口方法默认是 public abstract,实现类中必须用 public 修饰,且建议显式加 @Override:
interface Flyable { void fly(); }
class Bird implements Flyable {
@Override // ✅ 显式声明,便于识别和校验
public void fly() { System.out.println("Flapping wings"); }
}
不复杂但容易忽略——只要动了继承或实现关系,顺手加上 @Override,编译器就是你的第一道防线。

















