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()会有歧义。