2

私の質問はプロジェクトから来ています。それで、少し無関係な詳細を抽象化させてください。

foo()とbar()の2つの保護された静的メソッドを持つJAVAパブリッククラスAがあります。メソッドfoo()は、本体でbar()を呼び出します。

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

} 

これで、Aを拡張するクラスBもあります。Bでは、bar()をオーバーライドします。

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

}

最後に、Bのクラスからfoo()を呼び出します

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

2つのポイントが理解できません1.コンパイラー(Eclipse)から、@Overrideアノテーションを削除するように求められます。なんで?2.最後に、main()は「A.bar()」を出力します。これは、解決されたbar()ターゲットがクラスAであることを意味しますが、bar()をオーバーライドし、Aのfoo()を使用して変更されたbar( )。どうやってやるの?

あなたの意見は何ですか?

4

2 に答える 2

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

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

このチュートリアルを読むことを検討してください。

于 2012-05-04T21:52:31.620 に答える
6

静的メソッドをオーバーライドすることはできません。非静的インスタンスメソッドのみをオーバーライドできます。静的環境で継承を使用しようとしていますが、それは機能しません。本当に継承が必要な場合(そして、必要だと思うときは、実際には必要ありません)、メソッドを非静的にします。

于 2012-05-04T21:50:58.813 に答える