3

静的メソッドはオーバーライドできないとどこにでも書かれていますが、アクセス指定子をpublicからprotectedに減らすと、エラーが発生します。例えば

public class StaticOverrideFunda {

    public static void foo(){
        System.out.println("Parent Foo");
    }
}

public class B extends StaticOverrideFunda{


    protected static void foo(){
        System.out.println("Child Foo");
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        B.foo();            
    }
}

それは言う

継承されたメソッドの可視性を下げることはできません

つまり、オーバーライドルールに従っているのですが、なぜfooがBクラスでオーバーライドされていないと言っているのでしょうか。なぜそれが隠れている/影になっているのであり、オーバーライドしていないと言うのですか?

4

2 に答える 2

8

オーバーライドと同じルールのいくつかに従っていますが、それオーバーライドしているという意味ではありません。この場合、それはJLSのセクション8.4.8.3「オーバーライドと非表示の要件」のルールです。

オーバーライドまたは非表示のメソッドのアクセス修飾子(§6.6)は、次のように、少なくともオーバーライドまたは非表示のメソッドと同じ量のアクセスを提供する必要があります。[...]

メソッドが多態的に呼び出されないため、まだオーバーライドされていません。呼び出しを記述して、呼び出しを行ったり、呼び出しを行ったりすることはできませ。ターゲットはコンパイル時に完全に決定されます。StaticOverrideFunda.fooB.foo

オーバーライドをインスタンスメソッドで発生するものとして定義しているセクション8.4.8の残りの部分を確認する価値があります。

于 2012-04-24T11:52:57.170 に答える
-1

あなた自身があなたの質問に答えを投稿しました。オーバーライドとは、同じメソッドの子クラスに異なるコードを含めることを意味します。静的メソッドはオーバーライドできないため、アクセス指定子を変更して可視性を試すことはできません。

于 2012-04-24T11:54:43.703 に答える