public class Animal {
public void eat() { System.out.println("I eat like a generic Animal."); }
}
public class Wolf extends Animal {
@Override
public void eat() { System.out.println("I eat like a wolf!"); }
}
@Override
实际上是否具有功能或只是一种注释?
public class Animal {
public void eat() { System.out.println("I eat like a generic Animal."); }
}
public class Wolf extends Animal {
@Override
public void eat() { System.out.println("I eat like a wolf!"); }
}
@Override
实际上是否具有功能或只是一种注释?
这段内容来自于Java教程中的注解章节:
@Override
——@Override
注解 告诉编译器该元素意在覆盖超类中已声明的元素(覆盖方法将在"接口和继承"一课中讨论)。
// mark method as a superclass method // that has been overridden @Override int overriddenMethod() { }
尽管覆盖一个方法时不一定需要使用此注解,但使用它有助于防止出错。如果标记了
@Override
的方法未能正确地覆盖其中一个超类中的方法,则编译器会生成错误。让我们看看在Java语言规范中给出的示例 9.6.1.4 Override。假设您想要覆盖一个方法,比如
equals
,但是写成了:public boolean equals(Foo that) { ... }
改为:
public boolean equals(Object that) { ... }
虽然这段代码是合法的,但是如果在
equals
方法声明中注释上@Override
将会导致编译时错误,因为你实际上并没有覆盖该方法,而是重载了它。这可能会引起严重的错误,使用Override
注解类型有助于及早检测到这些问题。
Override注解是一种编译时注解,如果带有该注解的方法实际上没有覆盖父类方法,Java编译器会抛出错误。
您可以尝试将Wolf类更改为不扩展Animal类,如果存在Override注解,则会显示编译时错误。
public boolean equals(MyObject o)
而不是public boolean equals(Object o)
。 - user120587@Override既可以作为注释,也可以作为断言,表明您确实正在覆盖某些内容。如果您使用了@Override,但实际上并没有覆盖任何内容,编译器将生成一个错误。有关更多详细信息,请参阅文档页面。
它在运行时不执行任何操作,但可以帮助您捕获错误:
如果您认为自己将要覆盖一个方法,但由于拼写问题或参数类型而没有覆盖(如果没有注释),则代码将编译为无用的东西(例如:您的方法不会被调用,但是你意外地未覆盖的超类方法会被调用)。