@override报错常因父类方法修饰符不当:private或static方法不可覆盖,访问权限不能降级,final方法禁止覆盖;可用ide跳转查看父类定义快速验证。

检查 @Override 报错是否由父类方法修饰符问题引起,关键在于确认子类方法能否合法覆盖父类方法——修饰符冲突是常见但容易被忽略的原因。
看父类方法是不是 private 或 static
private 方法无法被继承,更谈不上覆盖;static 方法属于类本身,不参与多态,也不能被“重写”(只能隐藏)。如果父类中目标方法是:
- private void doWork() {} → 子类加 @Override 一定会报错,必须删掉注解,或改用其他设计(如模板方法)
- static String getValue() {} → 子类写 @Override public String getValue() {} 会失败,应移除 @Override,或把父类方法改为实例方法
核对访问权限是否降级
子类方法的访问修饰符不能比父类更严格。比如:
- 父类是 protected void init() {},子类写 private void init() {} + @Override → 编译报错
- 正确做法是子类用 protected 或 public(不能是 private 或包私有且父类是 protected)
确认父类方法没被 final 修饰
final 方法明确禁止覆盖。如果父类方法声明为:
- public final String getId() {}
- 子类哪怕签名完全一致,加上 @Override 也会触发编译错误
- 此时需评估:是误用了 @Override?还是该继承关系本身不合理?
快速验证技巧
不用逐行翻父类代码,可以借助 IDE 高效定位:
- 在子类 @Override 方法名上按 Ctrl + 点击(IntelliJ)或 F3(Eclipse),直接跳转到父类定义处,一眼看到修饰符
- 在父类方法上右键 → “Quick Documentation” 或 “Show Usages”,确认它是否可被覆盖
- 临时删掉 @Override,观察方法是否仍能被正常调用(即实际发生了隐式覆盖),再对比签名和修饰符差异










