实现接口方法的方法应该用@Override进行注释吗?
Override注释的javadoc说:
指示方法声明要重写超类中的方法声明。如果使用此注释类型注释了方法,但没有重写超类方法,则需要编译器生成错误消息。
我不认为接口在技术上是超类。真的是这样吗?
问题阐述
实现接口方法的方法应该用@Override进行注释吗?
Override注释的javadoc说:
指示方法声明要重写超类中的方法声明。如果使用此注释类型注释了方法,但没有重写超类方法,则需要编译器生成错误消息。
我不认为接口在技术上是超类。真的是这样吗?
问题阐述
当前回答
如果实现接口的类是一个抽象类,@Override用于确保实现是针对接口方法的;如果没有@Override,即使实现方法签名与接口中声明的方法不匹配,抽象类也可以很好地编译;不匹配的接口方法将保持未实现。 @Zhao引用的Java文档
该方法重写或实现在超类型中声明的方法
显然引用了一个抽象超类;接口不能称为超类型。 因此,@Override是冗余的,对于具体类中的接口方法实现并不合理。
其他回答
我相信javac的行为已经改变了——在1.5版本中它禁止注释,而在1.6版本中则没有。注释提供了额外的编译时检查,所以如果您使用的是1.6,我会选择它。
对我来说,这通常是一些代码需要Java 6编译的唯一原因。不确定是否值得。
这个回答可能太迟了。但是我希望这个例子能够帮助人们理解为什么@override如此重要(对于这样的场景)
public interface Restaurant(){
public boolean getBill();
public BigDecimal payAmount();
}
public interface Food() extends Restaurant{
public boolean haveSomeFood();
public boolean drinkWater();
}
public class Hungry() implements Food{
public boolean haveSomeFood(){}
public boolean drinkWater(){}
public boolean getBill(){}
public BigDecimal payAmount(){}
}
在上面的例子中,如果我饿了,我可以从餐馆里吃东西。但如果我拿出餐厅的实现,我不需要得到一个账单,也不需要支付金额!!!!
How?
界面Food有关键字extends Restaurant -这 意味着Hungry类也从接口实现 餐厅。 实际上从接口重写的方法是这样的 没有关键字@override 如果我移除关键字extends 餐厅(或者说如果我删除接口餐厅,它将不会 显示任何错误。
如果有@override,每当我试图删除餐厅界面,它将显示编译错误。
注意:当你实现一个接口时,你可能不知道这个接口是否被扩展到另一个接口,或者可以被扩展,或者继承可能被删除。所以最好使用@override关键字
如果一个具体类没有覆盖一个抽象方法,使用@Override来实现是一个开放的问题,因为编译器总是会警告你任何未实现的方法。在这些情况下,可以提出这样的论点,即它降低了可读性——在代码中需要阅读的内容更多,而且在较小的程度上,它被称为@Override而不是@ implementation。
这对JDK来说不是问题。在Eclipse Helios中,它允许对实现的接口方法使用@Override注释,无论使用哪种JDK 5或6。至于Eclipse Galileo,无论JDK 5还是6,都不允许使用@Override注释。