JAVA継承関係における静的符号ブロック、非静的符号ブロックの実行順序

1689 ワード

クラスのコードは、クラスの最初のオブジェクトを作成するときにロードされます(各クラスのコンパイルコードは独自の独立したファイルに存在します..classファイル)とは、クラスの最初のオブジェクトを作成するときにロードされますが、staticメソッドとstaticドメインにアクセスするとロードされます.(コンストラクタもstaticメソッドですが、staticキーワードは明示的に書かれていません).クラスが初めて使用されるときもstaticが初期化されると、すべてのstaticオブジェクトとstaticコードセグメントがロード時にプログラムの順序で(クラス内のコードの書き込み順序)を順次初期化します.staticのオブジェクトまたはコードは一度だけ初期化されます.静的コードブロックではなく、クラスのオブジェクトを作成するときに順次実行されます.
継承関係の場合、クラスをインスタンス化するときに親が存在する場合、親が先にロードされ(staticオブジェクトとstaticコードが順番に実行されます)、親が親である場合は、このルールに従ってクラスのロードが先に行われ、次にサブクラスのロード(同じようにstaticオブジェクトとstaticコードが順番に実行されます)が行われ、クラスのロードが終了するとオブジェクトの作成が開始されます.
オブジェクトを作成するときは、まず親の基本タイプがデフォルト値に設定され、オブジェクト参照がnullに設定されます.非静的コードブロックの実行(前のプロシージャは書き込みコードの順)、コンストラクタが自動的に呼び出され、サブクラスの基本タイプがデフォルト値に設定され、オブジェクトリファレンスがnullに設定され、非静的コードブロックの実行(前のプロシージャは書き込みコードの順)、コンストラクタが呼び出され、オブジェクトの作成が完了します.
コードの例は次のとおりです.
public class A {
	{
	        System.out.println("F");
	}
	
	private int i = 0;

	static {
		System.out.println("A");
	}
	
	{
		System.out.println(i);
	}
	
	public A(String temp) {
		this(temp, null);
	}
	
	public A(String temp1, String temp2) {
		System.out.println("X");
	}
	
}
public class B extends A {
	
	private int j = get();

	static {
		System.out.println("B");
	}
	
	private int get() {
	   System.out.println("get");
	   return 1;
	}
	
	{
		System.out.println("j2 = " + j);
	}
	
	{
		System.out.println("D");
	}
	
	public B() {
		super("nihao", "pengyou!");
		System.out.println("j1 = " + j);
	}
	
	public static void main(String[] args) {
		B b = new B();
	}
}

実行結果:
A B F 0 X get j2 = 1 D j1 = 1