静态方法重新定义规则

时间:2012-08-05 07:48:35

标签: java override 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中,它在以下位置显示错误: The return type is incompatible with Test2.show() 为什么?

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

Thanx提前!!

1 个答案:

答案 0 :(得分:7)

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

  1. 隐藏方法的返回类型(在子类中)必须与隐藏方法的返回类型(在超类中)分配兼容。
  2. 隐藏方法的访问修饰符必须不比隐藏方法更严格。
  3. m中的方法T在删除后具有相同的签名 是另一种方法n,可以在{{}中访问1}}除非在擦除之前T 的签名是方法m的子签名。
  4. 隐藏,覆盖或实现声明为抛出已检查异常的其他方法的方法的n子句存在限制。 (基本上,不能声明隐藏方法抛出未在hidden / overridden / implemented方法中声明的已检查异常。)
  5. 我认为就是这样,但请参阅JLS以获取更多详细信息。 JLS没有解释这些规则的基本原理,但大多数规则似乎都是为了防止多态性问题。您希望子类在使用父类的任何地方都可用。