推荐使用 @Override 注解——它虽非强制,但能明确重写意图并由编译器校验方法名、参数类型、返回值等是否匹配;不可用于 private/static 方法、签名不一致的方法或 Lombok 自动生成方法的自定义覆盖中未显式标注的情形。

子类重写父类方法时,推荐使用 @Override 注解,它不是必须的,但强烈建议加上——既能明确表达重写意图,又能让编译器帮你检查是否真的重写了父类方法(比如方法名拼错、参数类型不一致、返回值不兼容等)。
@Override 注解的正确写法
直接在子类中重写的方法上方加 @Override,无需任何参数:
<font color="#888"><pre class="brush:php;toolbar:false;">class Animal {
public void speak() {
System.out.println("Some sound");
}
}
class Dog extends Animal {
@Override // ✅ 正确:显式标注重写
public void speak() {
System.out.println("Woof!");
}
}
哪些情况不能加 @Override?
- 父类方法是
private—— 子类中同名方法属于新定义,不是重写,加@Override会编译报错 - 父类方法是
static—— 子类中同名静态方法属于隐藏(hiding),不是重写,加注解也会报错 - 子类方法与父类方法签名不一致(如参数个数/类型不同、返回值不协变)—— 编译器会提示“method does not override or implement a method from a supertype”
和 Lombok 的 @EqualsAndHashCode、@Data 等配合时注意
如果你用 Lombok 自动生成了 toString()、equals() 或 hashCode(),又想在子类里自定义其中某个方法,记得手动加上 @Override:
<font color="#888"><pre class="brush:php;toolbar:false;">@Data
class Person {
String name;
}
class Student extends Person {
int id;
@Override // ✅ 必须加,否则 Lombok 生成的 equals() 会被覆盖但无提示
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return id == student.id && Objects.equals(name, student.name);
}
}
Java 8+ 接口默认方法也能被 @Override
如果父接口有 default 方法,子类或实现类重写它时,同样应该加 @Override:
立即学习“Java免费学习笔记(深入)”;
<font color="#888"><pre class="brush:php;toolbar:false;">interface Flyable {
default void fly() {
System.out.println("Flying...");
}
}
class Bird implements Flyable {
@Override // ✅ 合法且推荐
public void fly() {
System.out.println("Flapping wings");
}
}


















