2012-05-04 14 views
2

私の質問はプロジェクトから来ています。だから私は少し無関係の詳細を抽象化してみましょう。保護されたメソッドをオーバーライドし、スーパークラスから呼び出すようにしてください

私は、2つの保護された静的メソッドfoo()とbar()を持つJAVA public class Aを持っています。メソッドfoo()は、本体のbar()を呼び出します。

public class A{ 
    protected static foo(){ 
    ... 
    bar() 
    ... 
    } 
    protected static bar(){print("A.bar()");} 

} 

が今もBでA.を拡張するクラスBを持っている、私が最後)(

class B extends A{ 
    @Overrides 
    static protected bar(){ print("A.bar() extended"); 

} 

をバーをオーバーライド、IはBにクラスからのfoo()を呼び出す

class B extends A{ 
    ... 
    public static main(){foo()} 
} 

2点を理解できません 1.コンパイラ(Eclipse)が@Overrideアノテーションを削除するように要求します。どうして? 2.最後にmain()は "abar()"を出力します。つまり、解決されたbar()ターゲットはクラスAですが、bar()をオーバーライドし、Aのfoo ()。どうやってやるの?

あなたの意見は?

答えて

7
  1. 静的メソッドを上書きすることはできません。
  2. すべてのメソッドは静的なので、静的にそれらを参照します。最初にA.foo()に電話をかけ、A.bar()を呼び出します。インスタンスを持たないため、メソッドのオーバーライドは機能しません。

コードからstaticをすべて削除し、new B().foo()を主に使用する必要があります。

これを読むことを検討するtutorial

6

静的メソッドをオーバーライドすることはできません。静的メソッドはオーバーライドできません。静的メソッドはオーバーライドできません。あなたは静的な環境で継承を使用しようとしていますが、それは動作しません。あなたが本当に継承を必要とする(そして、しばしばあなたがそうすると思うとき、本当にそうではない)場合、メソッドを非静的にします。

+2

私に投票した人には、私はすでにその日の投票に達しています。 @ Guillaumeの似たような答えを投票してください(私がすでに行ったように)。 :) –

+0

ねえ、ありがとう;-) –

関連する問題