8

どのようにその出力を生成するのか、理解できないコードがあります。これが以下のコードです-

コード:

class Bird {
  { System.out.print("b1 "); }
  public Bird() { System.out.print("b2 "); }
}
class Raptor extends Bird {
  static { System.out.print("r1 "); }
  public Raptor() { System.out.print("r2 "); }
  { System.out.print("r3 "); }
  static { System.out.print("r4 "); }
}
class Hawk extends Raptor {
  public static void main(String[] args) {
    System.out.print("pre ");
    new Hawk();
    System.out.println("hawk ");
  }
}

出力:

r1 r4 pre b1 b2 r3 r2 hawk

質問:

このコードに関する私の具体的な質問は-

  1. Hawkクラスがインストールされると、クラスがインストールさRaptorれるため、静的コード ブロックが最初に実行されます。ただし、印刷する前に、静的コードの後に​​非静的コードを続ける必要がありますpre。ではない?
  2. これらの非静的初期化ブロックは、実際にはコンストラクターのように機能しているようです。では、これらは通常のプログラミングでコンストラクターとして使用できますか?
4

4 に答える 4

7

pre を印刷する前に、静的コードの後に​​非静的コードを続ける必要があります。ではない?

  1. 実行Hawk.mainすると、3 つのクラスすべての初期化がトリガーされます。これは、静的初期化子が実行されるときです。
  2. pre印刷されます。
  3. new Hawk()3 つのクラスすべてのインスタンス初期化子の実行をトリガーします。

これらは通常のプログラミングでコンストラクターとして使用できますか?

それらは、コンストラクターからメソッドへのコードと一緒にコンパイルされ<init>ます。そうです、それらはコンストラクターコードに似ています。主な違いは、どのコンストラクターが実行されるかに関係なく実行され、コンストラクター本体の前に実行されることです。

于 2013-06-07T13:04:29.063 に答える
0
  1. 静的初期化子が最初に実行されます (実際には定義の順序で)
  2. 初期化ブロックを使用することもできますが、宣言時またはコンストラクターでフィールドを初期化するのが一般的な慣用句です。

Java チュートリアルでは、これについて詳しく説明しています。

于 2013-06-07T13:08:02.863 に答える