有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
方法的2
输出为Child
时。
javac是OpenJDK的版本javac 1.7.0_79
。
错误在哪里? (理想情况是将@Override
添加到静态
方法,但答案是OpenJDK
或我的想法中的这个错误也会很好。
答案 0 :(得分:2)
这里不是overriding任何内容......您刚刚在班级Child
中定义了一个名为getActivity()
的函数,这是一个不同的函数,隐藏了函数{在班级getActivity()
中{1}}。
更新:来自this question:
这并不意味着它压倒一切。在这种情况下,它是section 8.4.8.3 of the JLS中的规则,“覆盖和隐藏的要求”: