1. 概述

在本篇教程中,我们将深入探讨 Java 中 @Override 注解的使用方式和意义。

2. @Override 注解的作用

在 Java 的继承体系中,子类可以对父类中的实例方法进行重写(Override)重载(Overload)

  • 重写(Override):表示子类替换掉父类的实现逻辑。
  • 重载(Overload):表示子类新增了不同的方法签名(参数不同),属于新增行为。

⚠️ 但有时候我们本意是想重写一个方法,结果却因为方法签名不一致,意外地变成了重载,从而引发逻辑错误。这种问题在 Java 中非常常见,尤其是在处理 equalshashCode 等方法时。

来看一个经典例子:

public class Machine {
    public boolean equals(Machine obj) {
        return true;
    }

    @Test
    public void whenTwoDifferentMachines_thenReturnTrue() {
        Object first = new Machine();
        Object second = new Machine();
        assertTrue(first.equals(second));
    }
}

❌ 上面的测试会失败,原因就是 equals(Machine obj) 并没有重写 Object 类的 equals(Object obj) 方法,而是构成了重载关系。

✅ 为了避免这种低级错误,我们可以使用 @Override 注解来显式声明我们本意是重写父类方法。

@Override 加在方法上:

@Override
public boolean equals(Machine obj) {
    return true;
}

此时,编译器会报错,提示我们方法签名不匹配,从而帮助我们及时发现问题。

接着我们修正方法签名:

@Override
public boolean equals(Object obj) {
    return true;
}

✅ 编译通过,方法成功重写了父类的 equals

因此,强烈建议在所有打算重写父类方法的地方加上 @Override 注解,这是一种简单粗暴但非常有效的防御性编程手段。

3. 小结

通过本文我们了解到:

  • @Override 是一种用于显式声明方法重写的注解;
  • 它可以帮助我们避免因方法签名不一致导致的“意外重载”问题;
  • 所有重写父类方法的地方都应该加上 @Override,这是一个好习惯

💡 踩坑提醒:Java 编译器不会强制你加 @Override,但不加就等于放弃了编译期的保护。别偷懒,加上它!


原始标题:Java @Override Annotation | Baeldung