静态方法重新定义规则

Sur*_*ran 3 java static-methods overriding 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) {
    }

}
Run Code Online (Sandbox Code Playgroud)

在eclipse中它显示了一个错误: The return type is incompatible with Test2.show() 为什么?

第三,是否有遵循了重新定义静态方法它们相同压倒一切的,什么是对这些规则的原因,规则的任何其他规则?

Thanx提前!!

Ted*_*opp 7

隐藏静态方法的要求在Java语言规范的§8.4.8.3中详细说明.总的来说,它与实例方法相同:

  1. 隐藏方法的返回类型(在子类中)必须与隐藏方法的返回类型(在超类中)分配兼容.
  2. 隐藏方法的访问修饰符必须不比隐藏方法的访问修饰符更严格.
  3. 除非擦除之前的签名是方法的子签名,否则在擦除之后m,类中的方法在擦除之后T具有相同的签名是错误,这是另一种可访问的方法.nTm n
  4. throws隐藏,覆盖或实现声明为抛出已检查异常的其他方法的方法的子句有一些限制.(基本上,不能声明隐藏方法抛出未在hidden/overridden/implemented方法中声明的已检查异常.)

我认为就是这样,但请参阅JLS以获取更多详细信息.JLS没有解释这些规则的基本原理,但大多数规则似乎都是为了防止多态性问题.您希望子类在使用父类的任何位置都可用.