1. 程式人生 > >java類中的初始化模組

java類中的初始化模組

如果類中有多個建構函式都共享一段程式碼,並且各個建構函式之後不會呼叫其他的建構函式,那麼可以將這段公共的程式碼放在初始化模組中。

初始化模組是用{}括起來的語句塊,它位於類的宣告中,但不是包括在類方法或者類的建構函式中的。

它的作用就是相當於將初始化模組放到每個建構函式的最開始位置,用於初始化物件。

一個類可以有多個初始化模組,執行順序按照在類中出現的順序執行。

類中的初始化模組包括例項初始化模組跟靜態初始化模組

靜態初始化模組是用static關鍵字修飾的初始化模組

例項初始化模組只有在建立類的例項時才會被呼叫,而靜態初始化模組則是在類載入記憶體時呼叫。

注:類載入記憶體跟建立類的例項化不是相同的2個步驟,先是類的載入記憶體後才能例項化類的物件。

初始化模組的執行順序:

第一次使用類時先將類載入記憶體:

如果類的父類沒有載入記憶體則先將父類載入記憶體,這是一個遞迴過程,直到繼承鏈上所有的父類都載入到記憶體中

當載入每個類時,類的靜態資料域和靜態初始化模組按照它們在類中出現的先後順序執行

例項化類的物件時:

如果類的父類沒有例項化,則先構造父類。這也是一個遞迴過程,直到繼承鏈上所有的父類都構造好。

當構造每類時,按照類中出現的先後順序執行例項資料域跟例項初始化模組

最後執行類的建構函式

如果宣告類的例項變數有初始值,則變數的初始化就像在例項初始化模組中執行一樣

如果宣告類的靜態變數有初始值,則變數的初始化也像在靜態初始化模組中執行一樣

例子:

public class InitializationDemo{
	InitializationDemo(){
		new M();
	}
	public static void main(String[] args){
		new InitializationDemo();
	}
	{
		System.out.println("(2) InitializationDemo's instance initialization block");
	}
	static{
		System.out.println("(1) InitializationDemo's static initialization block");
	}
}

class N{
	N(){ 	System.out.println("(6) N's constructor body"); }
	{
		System.out.println("(5) N's instance initialization block"); 
	}
	static {
		System.out.println("(3) N's static initialization block"); 
	}
}
class M extends N{
	M(){ 	System.out.println("(8) M's constructor body"); }
	{
		System.out.println("(7) M's instance initialization block"); 
	}
	static {
		System.out.println("(4) M's static initialization block"); 
	}
}