462

实现接口方法的方法应该用 注释@Override吗?

注释javadocOverride说:

表示方法声明旨在覆盖超类中的方法声明。如果一个方法被这个注解类型注解但没有覆盖超类方法,编译器需要生成一个错误信息。

我不认为接口在技术上是超类。或者是吗?

Question Elaboration

4

15 回答 15

327

您应该尽可能使用@Override。它可以防止犯简单的错误。例子:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

这不会编译,因为它没有正确覆盖public boolean equals(Object obj).

实现接口(仅限 1.6 及更高版本)或覆盖 Super 类的方法的方法也是如此。

于 2008-10-17T15:21:31.270 回答
114

我相信 javac 的行为已经改变 - 1.5 它禁止注释,1.6 它没有。注释提供了额外的编译时检查,因此如果您使用的是 1.6,我会选择它。

于 2008-10-17T15:28:03.800 回答
79

如果方法可用,您应该始终注释方法@Override

在 JDK 5 中,这意味着覆盖超类的方法,在 JDK 6 和 7 中,这意味着覆盖超类的方法,并实现接口的方法。如前所述,原因是它允许编译器在您认为您正在覆盖(或实现)一个方法,但实际上是在定义一个新方法(不同的签名)时捕获错误。

equals(Object)vs.例子是一个标准的equals(YourObject)例子,但同样的论点可以用于接口实现。

我想注释接口的实现方法不是强制性的原因是JDK 5将此标记为编译错误。如果 JDK 6 强制使用此注释,它将破坏向后兼容性。

我不是 Eclipse 用户,但是在其他 IDE(IntelliJ)中,@Override只有在项目设置为 JDK 6+ 项目的情况下,才会在实现接口方法时添加注释。我想Eclipse是相似的。

但是,我更希望看到此用法的不同注释,也许是@Implements注释。

于 2011-11-25T09:10:12.010 回答
17

我会一有机会就使用它。请参阅何时使用 Java 的 @Override 注释以及为什么?

于 2008-10-17T15:27:35.410 回答
11

如果您正在实现接口中声明的方法(其编译错误), JDK 5.0 不允许您使用@Override注解,但 JDK 6.0 允许使用注解。因此,您可能可以根据您的要求配置您的项目偏好。

于 2009-06-08T12:01:31.633 回答
6

如果具体类没有覆盖抽象方法,则使用@Override实现是一个开放的问题,因为编译器总是会警告您任何未实现的方法在这些情况下,可以提出一个论点,即它降低了可读性——在你的代码上阅读更多的东西,在较小程度上,它被称为@Override而不是@Implement.

于 2015-12-19T00:48:57.817 回答
6

通过阅读java8中的javadoc,可以在interface Override的声明处找到如下内容:

如果使用此注解类型对方法进行注解,则编译器需要生成错误消息,除非至少满足以下条件之一:

  • 该方法确实覆盖或实现了在超类型中声明的方法。
  • 该方法的签名与 {@linkplain Object} 中声明的任何公共方法的签名等效。

因此,至少在 java8 中,您应该在接口方法的实现上使用 @Override。

于 2018-03-09T02:26:04.270 回答
3

覆盖从您自己的类继承的您自己的方法通常不会在使用 ide 进行重构时中断。但是,如果您覆盖从库继承的方法,建议使用它。如果你不这样做,你通常不会在以后的库更改中得到错误,而是一个隐藏得很好的错误。

于 2008-10-17T21:16:36.157 回答
3

这不是JDK的问题。在 Eclipse Helios 中,它允许对实现的接口方法使用 @Override 注解,无论是 JDK 5 还是 6。 至于 Eclipse Galileo,不允许使用 @Override 注解,无论是 JDK 5 还是 6。

于 2010-12-03T05:50:18.937 回答
3

如果实现的类interface是一个abstract类,@Override则有助于确保实现是针对interface方法的;即使实现方法签名与;中声明的方法@Override不匹配,如果没有 类,也可以正常编译。不匹配的方法将保持未实现状态。@Zhao 引用的 Java 文档abstractinterfaceinterface

该方法确实覆盖或实现了在超类型中声明的方法

显然是指一个abstract超类;aninterface不能称为超类型。因此,对于具体类中@Override的方法实现是多余的并且不明智。interface

于 2019-02-02T07:00:07.640 回答
2

对我来说,通常这是某些代码需要 Java 6 编译的唯一原因。不确定是否值得。

于 2009-01-29T00:52:04.290 回答
2

包含的问题@Override是它会让你认为你忘记调用该super.theOverridenMethod()方法,这是非常令人困惑的。这应该是非常清楚的。也许 Java 应该提供一个@Interface在这里使用。哦,好吧,又是一个半途而废的 Java 特性......

于 2014-03-19T20:47:38.203 回答
2

在 java 6 及更高版本中,您可以使用@Override实现接口的方法。

但是,我认为这没有意义:覆盖意味着您在超类中拥有一个方法,并且您正在子类中实现它。

如果您正在实现一个接口,我认为我们应该使用@Implement或其他东西,但不是@Override.

于 2016-09-28T06:57:31.920 回答
1

@Override当您在创建实现接口的类期间告诉它“生成未实现的方法”时,Eclipse 本身将添加注释。

于 2008-10-17T21:19:32.017 回答
0

这可能为时已晚。但我希望这个例子能帮助人们理解为什么@override如此重要(对于这样的场景)

public interface Restaurant(){
    public boolean getBill();
    public BigDecimal payAmount();
}

public interface Food() extends Restaurant{
    public boolean haveSomeFood();
    public boolean drinkWater();
}

public class Hungry() implements Food{
    public boolean haveSomeFood(){}
    public boolean drinkWater(){}
    public boolean getBill(){}
    public BigDecimal payAmount(){}
}

在上面的例子中,如果我是Hungry,我可以FoodRestaurant. 但是如果我拿出Restaurant的实施,我就不用拿账单也不需要付金额了!!!!

如何?

  • 该接口Food有关键字extends Restaurant- 这意味着 Hungry 类也是从接口 Restaurant 实现的。
  • 从接口实际覆盖的方法没有关键字@override
  • 因此,如果我删除关键字 extends Restaurant(或者说如果我删除接口 Restaurant,它不会显示任何错误。

如果有@override,每当我尝试删除 Restaurant 界面时,它都会显示编译错误。

注意:当您实现一个接口时,您可能不知道该接口是否扩展为另一个接口,或者是否可以扩展,或者继承可能会被删除。所以最好使用@override关键字

于 2022-01-25T20:51:46.207 回答