1. 程式人生 > >[Think in java]靜態資料的初始化

[Think in java]靜態資料的初始化

package com.test.two;

public class Test4 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("creating new cupboard in main ....");
		new Cupboard();
		System.out.println("creating new cupboard in main....");
		new Cupboard();
		table.f2(1);
		cupboard.f3(2);
	}
	static Table table = new Table();
	static Cupboard cupboard = new Cupboard();

}

class Bowl{
	Bowl(int marker){
		System.out.println("Bowl(" + marker + ")");
	}
	
	void f1(int marker){
		System.out.println("f1(" + marker + ")");
	}
}


class Table{
	static Bowl bowl1 = new Bowl(1);
	Table(){
		System.out.println("Table()");
		bowl2.f1(1);
	}
	
	void f2(int marker){
		System.out.println("f2(" + marker + ")");
	}
	static Bowl bowl2 = new Bowl(2);
}

class Cupboard{
	Bowl bowl3 = new Bowl(3);
	static Bowl bowl4 = new Bowl(4);
	Cupboard(){
		System.out.println("Cupboard()");
		bowl4.f1(2);
	}
	void f3(int marker){
		System.out.println("f3(" + marker + ")");
	}
	static Bowl bowl5 = new Bowl(5);
}

==============output=====================

Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)

Cupboard()
f1(2)
creating new cupboard in main ....
Bowl(3)
Cupboard()
f1(2)

creating new cupboard in main....
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(2)

=============分析===================

初始化的順序是先靜態物件,而後是"非靜態"物件。而且,靜態的物件只被初始化一次,之後不再被初始化。

總結一下物件的建立過程,假設有個名為Dog類:

1. 即使沒有顯式的使用static關鍵字,構造器實際上也是靜態方法。因此,當首次建立型別為Dog的物件時(構造器可以看成靜態方法),或者Dog類的靜態方法/靜態域首次被訪問時,Java直譯器必須查詢類路徑,以定位Dog.class檔案.

2. 然後載入Dog.class,有關靜態初始化的所有動作都會執行. 因此靜態初始化只在class物件首次載入的時候進行一次.

3. 當用new Dog()建立物件的時候,首先將在堆上為Dog物件分配足夠的儲存空間.

4. 這塊儲存空間會被清零,這就自動將Dog物件中的所有基本型別資料都設定成了預設值.而引用型別則被設定成了null.

5. 執行所有出現於欄位定義處的初始化動作.

6. 執行構造器.