@Override是Java编译时标记注解,核心作用是显式声明方法重写父类或接口方法,触发编译期校验以避免拼写错误、参数不匹配等伪重写问题,并提升代码可读性与可维护性。

在 Java 中,@Override 是一个**编译时注解**,它的核心作用是**明确告诉编译器:这个方法意在重写父类(或接口)中已有的方法**。它本身不改变程序行为,但能帮你避免常见错误——比如拼错方法名、参数类型不对、返回值不兼容等,一旦出错,编译器会立刻报错,而不是静默创建一个新方法。
什么时候必须加 @Override?
只要你在子类中**有意重写父类的非 private、非 static 方法**,或者**实现接口中的抽象方法**(从 Java 6 开始支持),就应加上 @Override。这不是可选项,而是强烈推荐的编码习惯。
- 重写父类
public或protected实例方法(如toString()、equals(Object)) - 实现接口定义的默认方法(
default)或抽象方法 - 重写父类中被
@Override标记过的方法(继承链中多层重写)
哪些情况加了反而会编译失败?
@Override 不是“装饰”,它有严格语义。以下情况加了就会报错:
- 方法签名(方法名 + 参数类型 + 参数顺序)和父类/接口中完全不匹配
- 试图重写
private方法(子类看不到,实际是定义新方法) - 试图重写
static方法(静态方法属于类,不是继承意义上的“重写”,而是隐藏) - 父类方法被
final修饰(禁止重写) - 返回类型不协变(例如父类返回
Object,子类想返回String可以;但返回Integer就不行,除非是子类型)
接口实现中 @Override 的使用要点
从 Java 8 起,接口可以有 default 方法;Java 9 支持 private 接口方法。此时:
立即学习“Java免费学习笔记(深入)”;
- 实现类重写接口的
default方法,必须加@Override - 实现类实现接口的抽象方法,也必须加
@Override(哪怕接口没写,你也要写) - 不要给接口自己的
default或static方法加@Override(它们不是重写,是定义)
常见误区与建议
误区:“加了 @Override 就算重写了”——错。是否重写取决于方法签名和访问权限,注解只是校验工具。
建议:
- IDE(如 IntelliJ、Eclipse)通常能自动帮你生成带
@Override的重写方法,善用它 - 重构父类方法时,所有加了
@Override的子类方法会立刻报错,提醒你同步更新 - 即使父类方法没有
@Override注解,你子类重写时仍要加——因为它是对你当前方法意图的声明 - 不要为了“看起来规范”而给构造方法、私有方法或静态方法加
@Override


















