6

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

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

    }
}


class Parent{
    public static void test () {

    }
}

Q1:由于静态方法不支持覆盖,两个类如何包含相同的方法?

Q2:如果更改静态方法以引发未定义的异常,则无法编译。为什么会这样。它显然不是压倒一切的,所以我应该被允许抛出新的异常,对吗?

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

    }
}
4

3 回答 3

10

A1: :static方法是每个类的。就多态性而言,它们与继承层次结构无关。所以调用Parent.test()会调用父方法,而调用Redefine.test()会调用子方法。

A2: JLS 8.4.8写道:

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

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

于 2010-07-15T12:28:54.270 回答
4

你没有覆盖它,你正在隐藏

http://faq.javaranch.com/java/OverridingVsHiding

你得到什么例外?

于 2010-07-15T12:31:42.253 回答
0

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

Q2:您的方法似乎有效。你得到什么错误?

于 2010-07-15T12:32:06.977 回答