【问题标题】:What's "@Override" there for in java?java中的“@Override”是什么?
【发布时间】:2010-03-22 04:07:06
【问题描述】:
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 syntax


【解决方案1】:

来自annotations 上的 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) { ... }

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

【讨论】:

  • 正确。在构建时间之后它不会影响任何东西。
  • 注解是否区分大小写?
  • @symfony 是的,注解是一种类型。
【解决方案2】:

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

【讨论】:

  • @symfony 不,不在上面的代码中。但是,如果您将eat 拼写为eats 并且没有@override,那么编译器会认为您正在创建一个新方法并且可以正常编译而不会发出警告。它允许编译器发现错误。更常见的是,它可以帮助开发人员发现错误是在方法参数中使用了错误的类型,例如使用 public boolean equals(MyObject o) 而不是 public boolean equals(Object o)
  • 最后,区分大小写吗?我看到你写的是@override 而不是@Override
  • 是的,它区分大小写。这只是我评论中的一个错字。仍在等待 SO 将编译器检查添加到注释部分。 :)
【解决方案3】:

如果您没有真正覆盖该方法,它会在编译时通过引发编译错误来发出警报。 类似的Q在这里-When do you use Java's @Override annotation and why?

【讨论】:

    【解决方案4】:

    它既可以用作注释,也可以用作断言您实际上正在覆盖某些内容。如果你使用@Override,但它实际上并没有覆盖任何东西,编译器会产生一个错误。 See the documentation page for more details.

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2010-10-08
          • 1970-01-01
          • 2023-03-06
          • 2012-02-11
          • 2010-09-10
          • 1970-01-01
          • 1970-01-01
          • 2013-07-31
          相关资源
          最近更新 更多