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

Java 在子类中重新定义静态方法,java,inheritance,static,scjp,Java,Inheritance,Static,Scjp,我想知道为什么Java(或一般的oops)首先允许这样做 我记得静态方法对于父类和子类都是通用的 public class Redefine extends Parent{ public static void test () { } } class Parent{ public static void test () { } } Q1:既然静态方法不支持重写,那么这两个类如何包含相同的方法 Q2:如果在static中更改方法以引发未定义的异常,则不会编

我想知道为什么Java(或一般的oops)首先允许这样做 我记得静态方法对于父类和子类都是通用的

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

    }
}


class Parent{
    public static void test () {

    }
}
Q1:既然静态方法不支持重写,那么这两个类如何包含相同的方法

Q2:如果在static中更改方法以引发未定义的异常,则不会编译。 为什么会这样。它显然不是重写的,所以应该允许我抛出新的异常,对吗

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

    }
}

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

A2:写入:

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

方法声明不得有与其覆盖或隐藏的任何方法的抛出子句冲突(§8.4.6);否则,将发生编译时错误


你不是在覆盖它,而是在隐藏它


您遇到了什么异常?

Q1:静态方法不会被覆盖,因此这是两个具有相同签名的不同方法。一个是用Parent.test()调用的,另一个是用Redefine.test()调用的


问题2:你的方法似乎有效。您会遇到什么错误?

re:Q2:如果您尝试声明为
抛出异常的REFEND.test()的OP版本,那么您应该会得到编译器错误
异常异常异常与Parent.test()中的throws子句不兼容。