Thinking in java 之:靜態數據的初始化及初始化順序

無論創建了多少個對象,靜態數據都只佔用一份存儲區域,static關鍵字不能應用於局部變量,因此它只能作用於域。如果一個域是靜態的基本類型域,且也沒有對它進行初始化,那麼它就會獲得基本類型的標準初值,如果它是一個對象引用,那麼它的默認初始化值就是null。

實例:

public class StaticInitialization {
	static Bowl b11 = new Bowl(11);
	// 非靜態成員變量,不在靜態域中,不會被初始化
	Bowl b22 = new Bowl(22);

	// 靜態方法不在靜態域中,不會被初始化
	public static void ss() {
		System.out.println("我是靜態方法");
	}
	static {
		System.out.println("我是靜態代碼塊");
	}

	public StaticInitialization() {
		System.out.println("初始化主類");
	}

	public static void main(String[] args) {
		System.out.println("sss");
	}
}

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

打印結果:

Bowl(11)
我是靜態代碼塊
sss

從打印結果看出,在調用main方法的時候,首先會加載main所在的這個類,會將這個類中所有靜態域中的內容進行初始化(靜態域包含靜態基本類型變量和靜態引用類型變量)。


瞭解了靜態域的初始化,那麼初始化順序是怎樣的呢?

實例:

public class OrderOfInitialization {
	OrderOfInitialization() {
		int a = 111;
		String b = "aa";
		System.out.println("初始化主類");
		System.out.println(b.toString());
	}

	static Window w5 = new Window(5);
	static {
		Window w6 = new Window(6);
	}
	public static void main(String[] args) {
		House h = new House(1);
		House h2 = new House(2);
		System.out.println("最後嗎");
	}
}

class Window {
	Window(int marker) {
		System.out.println("Window(" + marker + ")");
	}
}

class House {
	static {
		Window w7 = new Window(7);
		w7 = new Window(8);
	}
	Window w3 = new Window(3);
	House(int marker) {
		System.out.println("House(" + marker + ")");
		Window w1 = new Window(1);
	}

	static void test() {
		System.out.println(1111);
	}

	static Window w4 = new Window(4);
	Window w2 = new Window(2);
}

打印結果:

Window(5)
Window(6)
Window(7)
Window(8)
Window(4)
Window(3)
Window(2)
House(1)
Window(1)
Window(3)
Window(2)
House(2)
Window(1)
最後嗎

從上面的結果可以總結出類中的初始化順序和結論:

1.靜態成員>非靜態成員,並且按順序初始化。

2.構造方法外的成員變量>構造方法內的成員變量

3.不能在方法中定義和初始化靜態數據成員。

4.無論創建多少個對象,靜態域中的變量只會被初始化一次。

發佈了39 篇原創文章 · 獲贊 24 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章