Java中与@Override相对应的标签是什么?

5
我知道在Java中有一个标签@Override,用于注释覆盖超类方法的方法,如果没有,则会发出警告。 我的问题是:是否有相反的标记来注释我们不想从超类覆盖方法(例如,出于偶然原因)的方法?
我知道可以将超类中的方法设置为final,但这种解决方案涉及对超类代码的更改。这不是我想要做的 - 我只想更改自己的代码 :)
我知道可以为此方法设置另一个名称,但有时在超类中有很多方法,你可能根本不知道它们的存在。因此,当您在子类中实现自己的方法时,可能会偶然使用相同的名称。如何避免这种情况?
3个回答

5
不,没有预定义的Java注释是@Override的反义词。虽然如此,大多数IDE应该能够识别一个方法是否覆盖了另一个方法。例如,Eclipse就有这个功能。如果在轮廓视图中查看您的类,您会看到重写发生的小三角形。例如:
我相信NetBeans和IntelliJ Idea必须有类似的功能。
顺便说一下,你试图解决的这个问题,即避免无意中覆盖父方法,是一个严重而顽固的问题,特别是在扩展具有许多方法或大量继承层次结构的类时(以Swing组件为例--我曾经因为意外覆盖JPanel的getX()和getY()方法而遇到过一个非常令人沮丧的GUI错误)。这是另一个原因,通常情况下,如果组合在情况下是有意义的,那么优先考虑组合而不是继承。

1
然而,您可以使用JSR-308(类型注释)和Checkers框架自己构建类似的东西。请参见:http://types.cs.washington.edu/checker-framework/ - Brian Goetz
1
@BrianGoetz:如果你能展示如何做到这一点,具体创建一个注解,让编译器能够警告你意外的覆盖,请将此作为答案发布。 - Hovercraft Full Of Eels
5
同样的问题!我不小心覆盖了 getHeightgetWidth 方法,花费了一个多小时进行调试并想知道为什么不起作用! :) - bartektartanus
@bartektartanus: 是的!在我的一次性简短程序中,我会有一些继承自Swing组件的大型类,但是在我的重要程序中,我尽量避免这种情况(除非有必要,比如需要覆盖paintComponent方法时)。 - Hovercraft Full Of Eels

1
我一直在NetBeans中收到这个警告,尽管事实上我并没有覆盖该方法。我只是在子类构造函数中调用了一个子类方法,而NetBeans将其标记为覆盖。
即使没有相反的@override标签,一个简单的解决方案就是将该方法设置为private而不是public/protected,如果您知道您不会覆盖它或在该子类以下的任何地方使用它。

3
除非父类是由其他人编写的,而我无法访问或者我不想编辑这段代码,否则这将起作用。 :) - bartektartanus
当扩展别人的位于不同包中的类时,这就是答案。如果您声明一个没有public或protected修饰符的方法,您将会收到一个错误,说您不能降低超类方法的可见性。您不需要更改超类的代码。 - Steve Waring

0
在子类中给方法取一个与超类中不想覆盖的方法不同的名称或签名。

4
我知道我可以为这个方法设置另一个名称,但有时在父类中有很多方法,而你可能并不知道它们的存在。因此,当你在子类中实现自己的方法时,可能会意外地使用相同的名称。如何避免这种情况? [我也将其添加到问题中] - bartektartanus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接