1. 概述
在本篇教程中,我们将深入探讨 Java 中 @Override
注解的使用方式和意义。
2. @Override
注解的作用
在 Java 的继承体系中,子类可以对父类中的实例方法进行重写(Override) 或 重载(Overload)。
- 重写(Override):表示子类替换掉父类的实现逻辑。
- 重载(Overload):表示子类新增了不同的方法签名(参数不同),属于新增行为。
⚠️ 但有时候我们本意是想重写一个方法,结果却因为方法签名不一致,意外地变成了重载,从而引发逻辑错误。这种问题在 Java 中非常常见,尤其是在处理 equals
、hashCode
等方法时。
来看一个经典例子:
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
,但不加就等于放弃了编译期的保护。别偷懒,加上它!