コード解釈オブジェクトの作成プロセス

3625 ワード

インターンシップログを書くために、私はコードを書いて次のオブジェクトの作成過程をテストしました...
まず、テストのコードを見てみましょう.

package com.test;

public class GrandFather {

	static {
		System.out.println("GrandFather's Static Block!");
	}

	private String grandFather = "This is grandFather!";

	{
		System.out.println("GrandFather's non Static Block!");
		System.out.println(this.grandFather);
	}

	GrandFather() {
		System.out.println("GrandFather's Constructor!");
	}

}

package com.test;

public class Father extends GrandFather {

	static {
		System.out.println("Father's Static Block!");
	}

	private String father = "This is father!";

	{
		System.out.println("Father's non Static Block!");
		System.out.println(this.father);
	}

	Father() {
		System.out.println("Father's Constructor!");
	}

}

package com.test;

public class Son extends Father {

	static {
		System.out.println("Son's Static Block!");
	}

	{
		System.out.println("Son's non Static Block!");
		System.out.println(this.son);
	}

	private String son = "This is son!";

	Son() {
		System.out.println("Son's Constructor!");
	}

	public static void main(String[] agrs) {
		new Son();
	}

}

3つのクラスで、前のクラスを上から下に順に継承します.
実行結果を見てみましょう.
GrandFather's Static Block!
Father's Static Block!
Son's Static Block!
GrandFather's non Static Block!
This is grandFather!
GrandFather's Constructor!
Father's non Static Block!
This is father!
Father's Constructor!
Son's non Static Block!
null
Son's Constructor!
分析:
GrandFather's Static Block!
Father's Static Block!
Son's Static Block!
Sonクラスのmainメソッドから実行し、仮想マシンはSonを検索します.classファイル、親がいることを発見し、Fatherを探しました.クラス、また気づいた.classには親がいるので、検索を続けます.やっと最上階の父上を見つけたGrandFather.class.次に、クラスのロードが完了し、オブジェクトが作成され、次にインスタンス化されます.
..........
GrandFather's non Static Block!
This is grandFather!
GrandFather's Constructor!
Father's non Static Block!
This is father!
Father's Constructor!
Son's non Static Block!
null
Son's Constructor!
最上位の親から最下位の子まで、次の手順に従います.
1.スタック内でオブジェクトにストレージスペースを割り当てる.
2、メンバー変数に初期値(0,false,null)を与える.
3.非静的データメンバーの付与初期値と非静的ブロックを順次実行する.
4、コンストラクション関数を実行します.
........
Father's non Static Block!
This is father!
........
Son's non Static Block!
null
........
Sonでnullとして出力されるのはなぜですか?
非静的ブロックと非静的メンバー変数を与える順序を入れ替えたからです.非静的ブロックは前にあります.
私がこのようにする理由は2つあります.
1.非静的ブロックが呼び出される前と非静的メンバー変数に初期値が付与される前に、非静的メンバー変数が既に存在し、デフォルト値が付与されていることを証明する
2.呼び出し非静的ブロックと非静的メンバー変数の初期値付与が同一優先レベルであることを証明する
まとめ:
オブジェクト作成プロセスは次のようになります.
1、あるクラスをマウントしようとすると、そのクラスのclassファイルを探し、親がいればその親のclassファイルを探して、最上位の親を探しています.
2、最上位の親から最下位のサブクラスまで順にオブジェクトを生成し、オブジェクト内のすべての静的メンバー変数と静的ブロックを実行する
3.最上位の親から最下位の子まで、次の手順に従います.
3.1スタック上でクラスに十分なストレージスペースを割り当てる
3.2オブジェクト内のすべてのデータをデフォルトに設定
3.3オブジェクトにおける非静的メンバー変数の初期値と非静的ブロックの付与を順次実行する
3.4コンストラクタの実行
PS:初心者が投稿します.間違いがあるかもしれません.もし間違いがあれば、レンガを撮ってください.