【发布时间】: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