每次有机会时,你应该使用@Override
。这可以防止犯下简单的错误。例如:
class C {
@Override
public boolean equals(SomeClass obj){
// code ...
}
}
这段代码无法编译,因为它没有正确覆盖public boolean equals(Object obj)
方法。
实现接口的方法(仅限1.6及以上版本)或覆盖超类方法的方法也是如此。
我认为javac的行为已经改变了 - 在1.5中,它禁止了注解,但在1.6中则不是。该注解提供了一个额外的编译时检查,因此如果您正在使用1.6,我建议您使用它。
@Override
来注释方法。在JDK 5中,这意味着覆盖超类的方法,在JDK 6和7中,它意味着覆盖超类的方法和实现接口的方法。原因如前所述,是它允许编译器捕获您认为正在覆盖(或实现)方法,但实际上正在定义新方法(不同的签名)的错误。
equals(Object)
与equals(YourObject)
示例是一个标准案例,但对于接口实现也可以提出同样的论点。@Override
注释。我想Eclipse是类似的。@Implements
注释。JDK 5.0不允许您在实现接口中声明的方法上使用@Override
注释(这会导致编译错误),但JDK 6.0允许。因此,您可以根据需要配置项目首选项。
如果一个具体类没有覆盖抽象方法,使用 @Override
来实现是一个开放性问题,因为编译器会不可避免地警告您有任何未实现的方法。在这些情况下,可以认为它会影响可读性--它是你代码中需要阅读的更多内容,稍微有点叫做 @Override
而不是 @Implement
。
@Override
有助于确保实现的是一个接口方法;如果没有 @Override
,即使实现方法的签名与接口中声明的方法不匹配,抽象类也可以编译通过;不匹配的接口方法仍然未被实现。这是@Zhao引用的Java文档。@Override
是多余且无意义的。这不是JDK的问题。在Eclipse Helios中,它允许对实现接口方法使用@ Override注释,无论是JDK 5还是6。至于Eclipse Galileo,无论是JDK 5还是6,都不允许使用@ Override注释。
重写你自己类中继承的方法通常不会在使用IDE进行重构时出现问题。但是,如果你重写了从库中继承的方法,建议仍然使用它。如果不这样做,你经常会在稍后库更改时得到没有错误,但是隐藏得很好的错误。