@override 应直接写在子类方法声明上方、单独一行、不带括号、不改变签名;仅用于可重写的方法(非 private/static/构造/字段),需确保方法名、参数类型、返回类型与父类或接口完全匹配,以提升可维护性与安全性。

直接加在方法声明上方,不带括号,不改签名——它本身不改变逻辑,只帮编译器确认你真在重写。
怎么正确添加 @Override
把 @Override 写在子类方法的最前面,单独一行,紧挨着访问修饰符(如 public、protected):
- ✅ 正确写法:@Override
public void run() { ... } - ❌ 错误写法:@Override()
private void run() { ... }(带括号、或访问权限比父类更严格) - 不能加在 static、private、构造方法、字段上
加了却报错?先核对这四点
编译失败提示 “does not override” 时,大概率是以下某一项没对齐:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 父类方法是不是 private 或 static?这两种方法根本不可重写
- 方法名拼错了(比如 hashcode() 而不是 hashCode())
- 参数类型不一致(int 和 Integer 不等价;List
和 ArrayList 也不匹配) - 返回类型不协变(父类返回 Object,子类可返回 String;但反过来不行)
为什么建议每处都加,哪怕不报错
不加 @Override,方法也可能运行时覆盖成功,但隐患藏得深:
- 父类删掉该方法后,子类代码照常编译,但实际变成一个全新方法,多态失效
- IDE 无法联动重构(比如重命名父类方法,子类不会自动同步)
- 团队协作时,别人一眼看不出这是定制逻辑还是新增功能
接口实现也适用 @Override
不只是继承父类,实现接口方法时同样推荐加:
- 接口中定义 void start();
- 实现类里写 @Override
public void start() { ... },编译器会检查是否真在实现该接口方法 - 如果接口升级加了新默认方法,而你忘了实现,加了注解反而能提前暴露缺失
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










