【问题标题】:error annotating a static method with @Override [duplicate]使用@Override 注释静态方法时出错 [重复]
【发布时间】:2015-08-07 00:23:46
【问题描述】:

Why doesn't Java allow overriding of static methods?, 它声称在 java 中不允许覆盖静态方法。然而它似乎在 OpenJDK 中工作:

编译这两个类在不使用@Override 时有效,但是 这样做时失败。 为了重现这一点,文件Parent.java 看起来像这样。

public class Parent {
    public static int getActivity() { return 1; }
}

文件Child.java如下:

public class Child extends Parent {
    // @Override public static int getActivity() { return 2; } // fails
    public static int getActivity() { return 2; } // works

    public static void main(String ... args) {
        System.out.println((new Child()).getActivity());
    }
}

错误是使用@Override时是

$ javac Child.java
Child.java:3: error: method does not override or implement a method from a supertype
@Override public static int getActivity() { return 2; }

删除@Override时,Child方法的输出是2

javac 是 OpenJDK 的 javac 1.7.0_79 版本。

错误在哪里? (理想的是将@Override 添加到静态 方法,但答案是这是OpenJDK 中的一个错误,或者我的想法也很好)

【问题讨论】:

  • 你不能覆盖静态方法
  • 静态方法不能被覆盖,但可以重新定义。这是两种不同的机制。如果使用静态方法扩展类,则可以通过在子类中定义具有相同签名的方法来重新定义方法。任何调用者都必须引用您的子类才能获得重新定义的方法。我在项目中使用过它,它工作正常。
  • @Tobb 它们不能被重新定义,它们只能被隐藏(这就是例子中发生的事情)。
  • @TheLostMind:这隐藏的工作原理。在 Java 和 C# 中,可以通过转换为适当的类型来规避隐藏。
  • 我看不出有理由否决这个问题,它有所有必要的信息来回答它。赞成将其恢复为 0。

标签: java


【解决方案1】:

你在这里不是overriding...你刚刚在Child类中定义了一个名为getActivity()的函数,它是独特的并且隐藏了函数getActivity()在@987654328类中@。

更新:来自this question

这并不意味着它是压倒一切的。在这种情况下,它是section 8.4.8.3 of the JLS,“覆盖和隐藏的要求”中的规则:

【讨论】:

  • 没有任何关系 -- 这不是entirely accurate
  • @aioobe 同意并更正,谢谢! ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2017-03-15
  • 1970-01-01
  • 2012-04-08
相关资源
最近更新 更多