在 Java 中实现抽象方法时是不是应该添加 @Override 注释?

Posted

技术标签:

【中文标题】在 Java 中实现抽象方法时是不是应该添加 @Override 注释?【英文标题】:Should I add an @Override annotation when implementing abstract methods in Java?在 Java 中实现抽象方法时是否应该添加 @Override 注释? 【发布时间】:2010-11-03 14:28:08 【问题描述】:

在Java中重写非虚拟方法时,建议使用@Override注解,但如果我实现抽象方法呢?我也应该使用@Override 吗?

【问题讨论】:

【参考方案1】:

在这种情况下,我倾向于使用@Override,这样如果超类发生更改(完全删除该方法或更改其签名等),该方法就会在子类中被标记。

唯一真正的区别是,如果没有注释,如果超类/接口中的方法被更改或删除,所讨论的实现只是成为该类的“正常”方法。因此,如果您只是为了履行合同而实施该方法,则应该添加注释;如果该方法在您的类中有意义,则您可能不应该添加它,而不管任何实现的接口或继承的抽象方法。

【讨论】:

你还需要 Java 6 来利用这个注解。 Java 5 不允许您将其放在接口实现上。【参考方案2】:

是的——它再次告诉编译器,“我真的想在这里重写一个方法。如果没有对应的方法要重写,我犯了一个错误,我想被告知!”

我个人认为很遗憾这只是一个注释而不是语言的一部分(就像在 C# 中一样),但这当然是事后诸葛亮的好处。

【讨论】:

这救了我几次皮肤。【参考方案3】:

是的。这是 Joshua Bloch 在 Effective Java 中推荐的做法。

【讨论】:

【参考方案4】:

实际上,Joshua Bloch 在Effective Java (2nd Ed.)第 178 页的最后一段中说,重写抽象方法的具体类的方法不必使用 @987654321 @ 注释,因为编译器无论如何都会给出错误。但是,“这样做并没有害处”。

我建议选择一种策略并始终如一地坚持下去。

【讨论】:

编译器会报错吗?你的意思是如果一个具体类实现了一个不是超类的抽象方法的方法,编译器会抱怨吗?这不可能是你的意思,但我不明白你的意思。 @LarsH 他的意思是,如果具体类没有实现超类中的抽象方法,编译器会报错,如果你拼错了子类的抽象方法的名称,就会出现这种情况需要实施。 @espertus:感谢您的澄清。因此,正如 Andrzej 所说,如果超类/接口中的方法被更改或删除,您将不会收到错误或警告。 @LarsH 对,如果您使用 Override 标签,您只会收到错误/警告。

以上是关于在 Java 中实现抽象方法时是不是应该添加 @Override 注释?的主要内容,如果未能解决你的问题,请参考以下文章

扩展三个在Java中实现接口的类

Java 抽象类接口

在 Java 中实现和使用通用的抽象接口

在某些派生类中实现虚函数的正确方法是啥?

Java中实现多态的机制

Java 抽象类 抽象方法 使用说明