Javaのブロック、静的ブロック、コンストラクション関数、継承された実行順序


コード・セグメントは次のとおりです.
public class Demo {
	public static void main(String[] agrs) {
		Son son = new Son();
	}
}

class Super {
	public Super() {
		System.out.print("A\t");
	}

	{
		System.out.print("B\t");
	}
	
	static {
		System.out.print("C\t");
	}
}

class Son extends Super {
	public Son() {
		System.out.print("D\t");
	}

	{
		System.out.print("E\t");
	}
	
	static {
		System.out.print("F\t");
	}
}

 
静的なものはクラスに属し,非静的なものはインスタンスに属する.静的ブロックは、クラスがメモリに呼び出された後に実行され、オブジェクトの作成やmainメソッドとは関係ありません.
静的ブロックは、クラス内の静的メンバーを初期化するために一般的に使用され、非晶質ブロックは、クラス内の非静的メンバーを初期化するために一般的に使用される.上記のコードセグメントでは,継承の問題も考慮する.まず、親静的-->C、次に子静的-->F非静的ブロックは、オブジェクトの作成時に自動的に実行されるコードであり、コンストラクション関数で親コンストラクション関数が実行された最初の部分と見なすことができます.(コンストラクション関数の最初の行にはデフォルトのsuper()呼び出しがあります.これは、親コンストラクション関数を呼び出すことです).このとき、親コンストラクション関数を実行します.親非静的ブロック-->B親コンストラクション関数ブロック-->A、次に子コンストラクション関数です.子非静的ブロック-->E子コンストラクション関数ブロック-->Dをまとめると、C F B A E Dは、静的なものは1回しか実行されません.つまり、クラスがロードされているときです.
前の例でmain関数を変更すると、次のようになります.
 
public static void main(String[] agrs) {
    Son son = new Son();
    Son son2 = new Son();
}

 
実行結果は次のとおりです.
C F B A E D B A E D