JAVAにおける構造方法、インスタンス初期化、静的初期化の実行順序について

7129 ワード

Java筆記試験では、構造方法、インスタンス初期化、静的初期化の実行順序は、常に考察されている知識点である。
次のような問題です。
下のコードを実行して出力した結果は…
 1 class A {
 2     public A() {
 3         System.out.println("class A");
 4     }
 5     { System.out.println("I'm A class"); }
 6     static { System.out.println("class A static"); }
 7 }
 8 public class B extends A {
 9     public B() {
10         System.out.println("class B");
11     }
12     { System.out.println("I'm B class"); }
13     static { System.out.println("class B static"); }
14      
15     public static void main(String[] args) {
16         new B();
17     }
18 }
実行順がわかれば、この問題の答えは分かります。
1  class A static 
2  class B static 
3  I'm A class 
4  class A
5  I'm B class 
6  class B
この順番は何のためですか?
考慮したいのは、javaにおける構造方法、インスタンス初期化、静的初期化の実行順序である。
まず単一のクラスを持って、実行の順序は?  静的初期化ブロック->初期化ブロック->コンストラクタ
私達は知っています。子類が父類を継承する時、執行順序は父類を先に実行して、サブクラスを実行します。上記の手順により、次のような実行手順が得られます。
  • 親タイプ静的初期化ブロック
  • サブクラス静的初期化ブロック
  • 親タイプ初期化ブロック
  • 父類コンストラクタ
  • サブクラス初期化ブロック
  • サブビルダー
  • 私たちは二回Bを実用化する時:
     1 class A {
     2     public A() {
     3         System.out.println("class A");
     4     }
     5     { System.out.println("I'm A class"); }
     6     static { System.out.println("class A static"); }
     7 }
     8 public class B extends A {
     9     public B() {
    10         System.out.println("class B");
    11     }
    12     { System.out.println("I'm B class"); }
    13     static { System.out.println("class B static"); }
    14      
    15     public static void main(String[] args) {
    16         new B();
    17         new B();
    18     }
    19 }
    下記の出力が得られます。
     1 class A static
     2 class B static
     3 I'm A class
     4 class A
     5 I'm B class
     6 class B
     7 I'm A class
     8 class A
     9 I'm B class
    10 class B
    静的な初期化ブロックはクラスの最初のローディング時にのみ実行されるので、上記のような動作結果が得られます。静的なコードブロックとコンストラクタではなく、new毎に一回実行されます。
    staticで修飾された語句や変数の特徴は、1.クラスのローディングに伴い、2.オブジェクトの存在より優先する3.すべてのオブジェクトの共有4.クラス名で呼び出すことができます。すなわち、クラスの方法です。