在子类中重新定义静态方法

Sud*_*kar 6 java inheritance static scjp

我想知道为什么在Java中首先允许这个(或者一般的oops)我记得静态方法对于父类和子类都是常见的

public class Redefine extends Parent{
    public static void test () {

    }
}


class Parent{
    public static void test () {

    }
}
Run Code Online (Sandbox Code Playgroud)

Q1:由于重写不支持静态方法,如何既能CLASSE包含相同的方法呢?

Q2:如果在static中更改方法则抛出未定义的异常,而不是编译.为什么会这样.它显然不是压倒一切所以我应该被允许抛出新的例外吗?

public class Redefine extends Parent{
    public static void test () throws Exception{

    }
}
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 10

A1: :static方法是按类.它们与多态性方面的继承层次结构无关.因此调用Parent.test()将调用父方法,而调用Redefine.test()将调用子方法.

A2: JLS 8.4.8写道:

如果一个类声明了静态方法m,则声明m被称为隐藏任何方法m',其中m的签名是m'签名的子签名(第8.4.2节),在m的超类和超接口中.该类中的代码可以访问的类.

方法声明不得具有与它覆盖或隐藏的任何方法冲突(第8.4.6节)的throws子句; 否则,发生编译时错误.