java静态方法重新定义规则
我知道这是一个非常热门的话题,但我需要澄清一些事情,所以请耐心听我说
静态方法与任何其他方法一样被继承,并且遵循关于访问修饰符的相同继承规则(私有方法不被继承等)
静态方法没有被过度使用,而是被重新定义。如果子类定义的静态方法与超类中的方法具有相同的签名,则称其为隐藏或隐藏超类的版本,而不是覆盖它,因为它们不像实例方法那样具有多态性
重新定义的静态方法似乎仍然遵循一些(如果不是全部的话)超越规则
首先,重新定义的静态方法的访问限制不能超过超类的静态方法。为什么
其次,返回类型也必须在超类和子类的方法中兼容。例如:
class Test2 {
static void show() {
System.out.println("Test2 static show");
}
}
public class StaticTest extends Test2 {
static StaticTest show() {
System.out.println("StaticTest static show");
return new StaticTest();
}
public static void main(String[] args) {
}
}
在eclipse中,它在以下位置的第行显示错误:
The return type is incompatible with Test2.show()
为什么
和第三,在重新定义静态方法时,是否遵循了与过度驾驶规则相同的任何其他规则,这些规则的原因是什么
提前谢谢
# 1 楼答案
隐藏静态方法的要求在§8.4.8.3 of the Java Language Specification中有详细说明。大体上,它与实例方法相同:
T
中的方法m
在擦除后与在T
中可访问的另一个方法n
具有相同的签名是错误的,除非在擦除之前m
的签名是方法n
的子签名李>throws
子句有限制,这些方法隐藏、重写或实现声明为抛出选中异常的其他方法。(基本上,不能将隐藏方法声明为抛出未在隐藏/重写/实现方法中声明的已检查异常。)李>我想就这样了,但更多细节请参见JLS。JLS没有解释这些规则的基本原理,但大多数规则似乎旨在防止多态性问题。您希望子类在使用父类的任何地方都可用