@Override注解必须写在子类重写方法声明正上方、访问修饰符前且独占一行;仅适用于非private、非static、非final的可重写方法;接口实现或default方法重写也需添加,否则编译报错。

直接写在子类方法声明的正上方,单独一行,不加括号,也不改动方法签名——它本身不改变逻辑,只让编译器帮你确认是否真在重写。
正确添加位置和格式
@Override 必须紧挨着方法的访问修饰符(如 public、protected 或默认包权限),写在最前面,独占一行:
- ✅ 正确:
@Override
public void run() { ... } - ❌ 错误:
@Override()
private void run() { ... }(带括号、或访问权限比父类更严格) - ❌ 错误:
public @Override void run() { ... }(注解不能放在修饰符后面)
只能加在可重写的方法上
以下情况不能加 @Override,否则编译直接报错:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 父类方法是 private(子类根本看不到,谈不上重写)
- 父类方法是 static(属于类级别,只能隐藏,不能重写)
- 父类方法是 final(明确禁止重写)
- 是构造方法或字段(语法层面不支持)
加了却报错?重点核对四点
如果编译提示 “method does not override”,说明签名没对齐,立即检查:
立即学习“Java免费学习笔记(深入)”;
- 方法名是否拼错(比如 hashcode() 而不是 hashCode())
- 参数类型是否完全一致(int ≠ Integer;List<String> ≠ ArrayList<String>)
- 返回类型是否满足协变规则(父类返回 Object,子类可返回 String;但反过来不行)
- 父类方法是否存在且可访问(比如父类改名、删方法、或被移到其他包里)
接口实现也必须加
实现接口的抽象方法,或重写接口的 default 方法时,同样要加 @Override:
- 接口升级新增 default 方法后,如果你漏实现,加了注解会立刻报错
- 接口方法改名或调整参数,IDE 和编译器能第一时间提醒你同步修改
- 避免把“实现接口”误写成普通方法,导致多态调用失败

















