0
public class ExtAA extends AA {
   static int iTime;

   public static void main(String argv[]) {
       ExtAA d = new ExtAA();
       d.func(iTime);
   }

   public static void func(int iTime) {
      System.out.println(iTime);
   }

   public ExtAA() { }
}



class AA {
   public AA() { System.out.println("AA");  }
}

プリント:

AA
0

public ExtAA() { }のコンストラクターをオーバーライドすることを期待していたAAので、AAを出力せず、ただ0。誰かが私が間違っている方法を説明できますか?コンストラクターをオーバーライドしたい場合はどうすればよいですか?

PS私の質問がばかげている可能性は完全にありますが、public ExtAA(){}が何をすべきかまたは何ができるかわかりません。これはテスト中だったので、めちゃくちゃになって、実際に何が起こっているのか知りたいです(はい、デバッグに入り、段階的に調べました。独自に定義されたコンストラクターの代わりにnew ExtAA使用する理由がわかりません)AA

4

3 に答える 3

5

Java のスーパークラスのコンストラクターは常に呼び出されます。あなたはそれを止めることはできません。コンストラクターが複数ある場合は、どのコンストラクターを呼び出すかを制御できます。

Java の基本的なチュートリアルを読むことを検討してください。これは Java OOP の初歩的なことです。

暗黙的に、コンストラクターは次のようになります。

public ExtAA() {
    super(); // Constructor of super class call, always first line of code in child constructor
}
于 2013-02-05T10:03:05.017 に答える
2

オブジェクトには、独自のクラスのフィールドに加えて、その親クラスである祖父母クラスのすべてのフィールドがあり、ルート クラスのオブジェクトまで存在します。すべてのフィールドを初期化する必要があるため、すべてのコンストラクターを呼び出す必要があります! Java コンパイラは、必要なコンストラクター呼び出しをコンストラクター チェーンのプロセスに自動的に挿入しますが、明示的に挿入することもできます。

于 2013-02-05T10:06:54.607 に答える
2

ベースからコンストラクターをスキップできると想像してみてください。オブジェクトの親部分が非常に不安定な状態になる可能性があります。

基本クラスがコンストラクターで何らかの意味のある初期化を行う状況について考えてみてください。それができない場合、突然、オブジェクトの基本クラスの部分がクレイジー タウンになります。これが、Java がこのように動作することを決定した理由であるとほぼ間違いありません。

非常に簡単な例として、ArrayList を拡張する SortedArrayList クラスがあるとします。SortedArrayList がどういうわけか ArrayList コンストラクターのいずれも呼び出さなかった場合、オブジェクトの内部構造は理にかなっていると思いますか? どこかにヌル化されたデータ構造があり、物事がクラッシュして燃えることを意味します。特定の状況では、コンストラクターをオーバーライドすることは理にかなっているかもしれませんが、どうやら Java の人々は、誤ってそれを行うリスクはその能力に値しないと感じていたようです (そして、うまく設計されたクラス グラフではほとんど意味がありません - 子クラス何らかの形で基底クラスに依存していないのに、なぜそもそも子クラスなのですか?)。

于 2013-02-05T10:05:36.860 に答える