到目前为止,我从未在方法之前添加“@Override”。我看到了一些代码示例,但我不明白它的实用性。我想要一些解释。
非常感谢,
JDelage
答案 0 :(得分:8)
表示方法声明旨在覆盖超类中的方法声明。如果使用此批注类型注释方法但不覆盖超类方法,则编译器需要生成错误消息。
http://download.oracle.com/javase/6/docs/api/java/lang/Override.html
我想解释其用法的情况是覆盖equals
。
这会出错,因为equals
需要Object
参数:
public class Foo{
@Override
public boolean equals(Foo f){
return true;
}
}
答案 1 :(得分:7)
首先,您无法使用@Override
注释类。此批注指示方法声明旨在覆盖超类中的方法声明。
如果使用此批注并且带注释的方法不覆盖超类方法,则不必注释重写方法但,编译器将生成错误消息。
答案 2 :(得分:5)
最好的例子 - 覆盖equals()
。
如果你写这样的课:
public class Foo
{
public String bar;
public boolean equals(Foo other)
{
return this.bar.equals(other.bar);
}
}
然后你重载 equals方法,而不是按预期覆盖Object.equals
。
如果使用@Override
注释equals方法,编译器会给出一个错误,指出(正确地)您没有覆盖超类方法。
在Java 6中,您也可以使用它来实现接口方法 - 当您只在类中添加一个方法来满足某个接口时,这很方便,因此编译器可以检查它是否是必需的并提醒您界面变化。
与所有注释一样,它实际上是一个程序化注释,但让编译器检查您的假设是否(仍然)正确在这些情况下非常方便。
答案 3 :(得分:2)
这是表示您希望该方法重写超类方法。当你拼错方法名称或给它错误的参数时,它确实派上用场,这样它就不会覆盖你认为它覆盖的内容。
答案 4 :(得分:1)
这是一个传统的评论。一些编译器确保@Override后面的函数实际上是一个覆盖...只是一个故障保护