有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    隐藏静态方法的要求在§8.4.8.3 of the Java Language Specification中有详细说明。大体上,它与实例方法相同:

    1. 隐藏方法的返回类型(在子类中)必须与隐藏方法的返回类型(在超类中)的赋值兼容
    2. 隐藏方法的访问修饰符不得比隐藏方法的访问修饰符更严格
    3. T中的方法m在擦除后与在T中可访问的另一个方法n具有相同的签名是错误的,除非在擦除之前m的签名是方法n的子签名
    4. 对方法的throws子句有限制,这些方法隐藏、重写或实现声明为抛出选中异常的其他方法。(基本上,不能将隐藏方法声明为抛出未在隐藏/重写/实现方法中声明的已检查异常。)

    我想就这样了,但更多细节请参见JLS。JLS没有解释这些规则的基本原理,但大多数规则似乎旨在防止多态性问题。您希望子类在使用父类的任何地方都可用