6

これがJavaで最初に許可された理由を知りたい(または一般的におっと)静的メソッドは親クラスと子クラスの両方で共通であることを覚えています

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{

    }
}
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: 静的メソッドはオーバーライドされないため、これらは同じシグネチャを持つ 2 つの異なるメソッドです。1 つは Parent.test() で呼び出され、もう 1 つは Redefine.test() で呼び出されます。

Q2: あなたの方法は有効に思えます。どのようなエラーが表示されますか?

于 2010-07-15T12:32:06.977 に答える