在java中有什么“@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实际上是否有某些function,或者它只是有点评论?

从Java教程注释 :

@Override@Override注释通知编译器该元素是要覆盖超类中声明的元素(覆盖方法将在标题为“接口和inheritance”的课程中讨论)。

  // mark method as a superclass method // that has been overridden @Override int overriddenMethod() { } 

虽然在重写方法时不需要使用此注释,但它有助于防止错误。 如果使用@Override标记的方法无法正确覆盖其某个超类中的方法,则编译器会生成错误。

让我们看一下Java语言规范9.6.1.4覆盖中给出的示例。 假设您要覆盖一个方法,在这种情况下equals ,但您写道:

  public boolean equals(Foo that) { ... } 

代替:

  public boolean equals(Object that) { ... } 

虽然这段代码是合法的,但使用@Override注释equals方法声明会触发编译时错误,因为你实际上没有覆盖它,你正在重载它。 这可能会导致令人讨厌的错误,而Override注释类型有助于及早发现它们。

覆盖注释是一个编译时注释,如果具有此注释的方法实际上没有覆盖父类方法,则会使java编译器抛出错误。 您可以尝试更改Wolf类以不扩展Animal类,如果存在Override注释,它将显示编译时错误

如果您没有真正重写该方法,那么它会在编译时通过抛出编译错误来发出警报。 类似的Q 在这里 – 你什么时候使用Java的@Override注释?为什么?

它作为一个注释,但也作为一个断言,你实际上是覆盖的东西。 如果您使用@O​​verride,但它实际上没有覆盖任何内容,编译器将生成错误。 有关详细信息,请参阅文档页面 。

如果从父类中删除“eat”方法或将其拼写为子类中的“eats”,则代码现在将无法编译。 没有“@Override”注释,你可以做任何一个,你的代码仍然会编译,它只是不会做你想要的(即覆盖一个方法)。

它在运行时没有做任何事情,但它可以帮助您捕获错误:

如果你认为你会覆盖一个方法,但是没有(因为一个拼写问题或参数类型),没有注释,代码会编译成无用的东西(如:你的方法不会被调用,但超类方法,你不小心没有覆盖被调用)。