Java 重新定义规则的静态方法
我知道这是一个非常热门的话题,但我需要澄清一些事情,所以请耐心听我说 静态方法与任何其他方法一样被继承,并且遵循关于访问修饰符的相同继承规则(私有方法不被继承等) 静态方法没有被过度使用,而是被重新定义。如果子类定义的静态方法与超类中的方法具有相同的签名,则称其为隐藏或隐藏超类的版本,而不是覆盖它,因为它们不像实例方法那样具有多态性 重新定义的静态方法似乎仍然遵循一些(如果不是全部的话)超越规则 首先,重新定义的静态方法的访问限制不能超过超类的静态方法。为什么 其次,返回类型也必须在超类和子类的方法中兼容。例如:Java 重新定义规则的静态方法,java,overriding,static-methods,redefinition,Java,Overriding,Static Methods,Redefinition,我知道这是一个非常热门的话题,但我需要澄清一些事情,所以请耐心听我说 静态方法与任何其他方法一样被继承,并且遵循关于访问修饰符的相同继承规则(私有方法不被继承等) 静态方法没有被过度使用,而是被重新定义。如果子类定义的静态方法与超类中的方法具有相同的签名,则称其为隐藏或隐藏超类的版本,而不是覆盖它,因为它们不像实例方法那样具有多态性 重新定义的静态方法似乎仍然遵循一些(如果不是全部的话)超越规则 首先,重新定义的静态方法的访问限制不能超过超类的静态方法。为什么 其次,返回类型也必须在超类和子类的
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中,它在以下位置的第行显示错误:
返回类型与Test2.show()不兼容。
为什么
和第三,在重新定义静态方法时,是否遵循了与过度驾驶规则相同的任何其他规则,这些规则的原因是什么
提前谢谢 中详细说明了隐藏静态方法的要求。大体上,它与实例方法相同:
T
中的方法m
在擦除后与T
中可访问的另一方法n
具有相同的签名是错误的,除非擦除前m
的签名是方法n
的子签名throws
子句有限制,这些子句隐藏、重写或实现声明为抛出选中异常的其他方法。(基本上,不能将隐藏方法声明为抛出未在隐藏/重写/实现方法中声明的已检查异常。)我想就这样了,但更多细节请参见JLS。JLS没有解释这些规则的基本原理,但大多数规则似乎旨在防止多态性问题。您希望在使用父类的任何地方都可以使用子类。请告诉我。我将把我的答案留作评论:简言之,Java不允许定义会导致调用哪个方法不明确的方法。在您的示例中,我怀疑编译器会抱怨,因为StaticTest.show()会有歧义。