【问题标题】:static method redefining rules静态方法重新定义规则
【发布时间】:2012-08-02 15:03:52
【问题描述】:

我知道这是一个相当老掉牙的话题,但我需要澄清一些事情,所以请耐心等待。

静态方法与任何其他方法一样被继承,并遵循关于访问修饰符的相同继承规则(私有方法不被继承等)

静态方法不会被覆盖,它们会被重新定义。如果一个子类定义了一个与超类中具有相同签名的静态方法,则称它是隐藏或隐藏超类的版本而不是覆盖它,因为它们不像实例方法那样具有多态性。

重新定义的静态方法似乎仍然遵循一些(如果不是全部)最重要的规则。

首先,重新定义的静态方法不能比超类的静态方法受到更多的访问限制。为什么??

其次,返回类型也必须在超类和子类的方法中兼容。例如:

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() 为什么??

第三,在重新定义静态方法时是否遵循与覆盖规则相同的其他规则,这些规则的原因是什么?

提前谢谢!!

【问题讨论】:

    标签: java overriding static-methods redefinition


    【解决方案1】:

    §8.4.8.3 of the Java Language Specification 详细说明了隐藏静态方法的要求。总的来说,它与实例方法相同:

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

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

    【讨论】:

    • 打败我。我将把我的答案作为评论留下:简而言之,Java 不允许定义会导致对调用哪个方法产生歧义的方法。在您的示例中,我怀疑编译器会抱怨,因为 StaticTest.show() 会模棱两可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2017-04-19
    相关资源
    最近更新 更多