使用Java的@Override注释的最佳实践是什么?为什么?
用@Override注释标记每个被重写的方法似乎有点过分。是否有某些编程情况需要使用@Override,而其他情况不应该使用@Override?
使用Java的@Override注释的最佳实践是什么?为什么?
用@Override注释标记每个被重写的方法似乎有点过分。是否有某些编程情况需要使用@Override,而其他情况不应该使用@Override?
当前回答
@Override注释用于帮助开发人员检查是否重写父类或接口中的正确方法。当super的方法名发生变化时,编译器会通知这种情况,这只是为了与super和子类保持一致。
顺便说一句,如果我们没有在子类中声明注释@Override,但我们重写了super的一些方法,那么这个函数可以像@Override那样工作。但是当super的方法被更改时,这个方法不能通知开发人员。因为它不知道开发人员的目的——重写super的方法还是定义一个新方法?
因此,当我们想要重写该方法以使用多态性时,最好在该方法上方添加@Override。
其他回答
我认为它在编译时提醒大家,该方法的目的是重写父方法。举个例子:
protected boolean displaySensitiveInformation() {
return false;
}
您将经常看到类似上述方法的内容,它覆盖基类中的方法。这是该类的一个重要实现细节——我们不希望显示敏感信息。
假设这个方法在父类中被更改为
protected boolean displaySensitiveInformation(Context context) {
return true;
}
此更改不会导致任何编译时错误或警告-但它完全改变了子类的预期行为。
回答您的问题:如果在超类中缺少具有相同签名的方法,则表明存在错误,则应该使用@Override注释。
为了从编译器检查中获益,你应该总是使用Override注释。但是不要忘记Java Compiler 1.5在覆盖接口方法时不允许这个注释。您只能使用它来重写类方法(抽象与否)。
有些ide(如Eclipse)甚至配置了Java 1.6运行时或更高版本,它们保持与Java 1.5的一致性,并且不允许像上面描述的那样使用@override。要避免这种行为,您必须转到:项目属性->Java编译器->勾选“启用项目特定设置”->选择“编译器遵从级别”= 6.0或更高。
我喜欢在每次独立重写方法时使用这个注释,如果基是一个接口或类。
这可以帮助您避免一些典型的错误,例如当您认为您正在重写事件处理程序时,然后您没有看到发生任何事情。假设你想给某个UI组件添加一个事件监听器:
someUIComponent.addMouseListener(new MouseAdapter(){
public void mouseEntered() {
...do something...
}
});
上面的代码编译并运行,但是如果你将鼠标移动到someUIComponent内部,“do something”代码将提示运行,因为实际上你没有覆盖基本方法mouseEntered(MouseEvent ev)。您只需创建一个新的无参数方法mouseEntered()。如果您使用了@Override注释,那么您将看到一个编译错误,并且没有浪费时间思考为什么事件处理程序没有运行。
在实现接口方法时使用@Override完全没有意义。在这种情况下使用它没有任何好处——编译器已经发现了你的错误,所以这只是不必要的混乱。
很简单——当您想重写父类中出现的方法时,使用@Override注释来进行正确的重写。如果你没有正确地覆盖它,编译器会警告你。
@Override注释用于帮助开发人员检查是否重写父类或接口中的正确方法。当super的方法名发生变化时,编译器会通知这种情况,这只是为了与super和子类保持一致。
顺便说一句,如果我们没有在子类中声明注释@Override,但我们重写了super的一些方法,那么这个函数可以像@Override那样工作。但是当super的方法被更改时,这个方法不能通知开发人员。因为它不知道开发人员的目的——重写super的方法还是定义一个新方法?
因此,当我们想要重写该方法以使用多态性时,最好在该方法上方添加@Override。