@override注解触发编译器检查,确保方法真正重写父类或接口方法;未匹配则编译失败,避免拼写错误、参数不一致等隐蔽bug,提升代码健壮性。

@Override 注解本身不“强制”校验,但它能**触发编译器检查**:当它标注的方法**并非真正重写父类或接口中的方法时,编译直接失败**。这是 Java 提供的静态安全机制,避免因拼写错误、参数不一致、返回类型不兼容等导致“看似重写、实则新建”的隐蔽 bug。
什么时候必须加 @Override?
只要你的意图是重写(override)——即在子类中提供父类已有方法的新实现——就应当显式加上 @Override。这包括:
- 重写父类的非 final 实例方法(public/protected/package-private)
- 实现接口中定义的默认方法(default method)
- 重写接口中继承来的方法(如重写 Object 的 toString(),即使没显式 extends)
它能帮你发现哪些典型错误?
加了 @Override 后,以下情况会立即报编译错误,而不是静默通过:
-
方法名拼错:比如把
toString()写成toStirng() -
参数列表不匹配:父类是
void print(String s),你写了void print(String... s)或void print(Object s) -
返回类型不协变:父类返回
Object,你返回String是允许的(协变返回),但若返回Integer而父类是String就不合法 -
访问修饰符更严格:父类是
protected void run(),你写成private void run()(不允许缩小可见性) -
试图重写 static 或 final 方法:如对
static void helper()加 @Override,编译报错
常见误区澄清
- 它不是运行时检查:不依赖 JVM,纯编译期行为,无性能开销
- 不适用于重载(overload):同一类中参数不同的同名方法,加 @Override 会编译失败
- Java 5 开始支持,但只用于父类方法;Java 6+ 才支持对接口默认方法使用
- 不加 @Override 不代表不能重写,只是失去编译器保护,容易埋雷
一个对比示例
假设父类:
class Animal {
public void speak() {
System.out.println("Some sound");
}
}
错误写法(没加 @Override,编译通过但实际未重写):
class Dog extends Animal {
public void speek() { // 拼写错误 → 新增方法,非重写
System.out.println("Woof!");
}
}
正确写法(加 @Override,编译失败,立刻暴露问题):
class Dog extends Animal {
@Override
public void speek() { // 编译报错:method does not override or implement a method from a supertype
System.out.println("Woof!");
}
}
修复后:
class Dog extends Animal {
@Override
public void speak() { // ✅ 编译通过,明确表达重写意图
System.out.println("Woof!");
}
}
养成习惯:只要你在写“本意是重写”的方法,第一件事就是敲上 @Override。它不改变逻辑,却大幅提升代码健壮性和可维护性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











