1. 程式人生 > >建立一個類的時候java的執行順序

建立一個類的時候java的執行順序

當我們建立在一個類的時候,java在做那些事情,順序是什麼

<span style="font-size:14px;">public class text {
	private int i=8;
	private int k=9;
	static int j=8;
	static {
		 j=8;
		 System.out.println(j);
	}
	public text(int k){
		this.k=k;
		System.out.println("k:2");
		System.out.println("2");
	}
	{
		i1=9;
		System.out.println("s");
//		s="sss";//錯誤,因為沒有s這個變數。
	}
	private int i1=6;
	
//	{
//		i1=9;
//		System.out.println("s");
//	}
	public void printf(){
		System.out.println(this.i1);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		text t=new text(2);
		t.printf();
		text t1=new text(2);
		t1.printf();

	}

}
</span>

我們以這段程式碼來看,程式碼的執行結果如下

8
s
k:2
2
6
s
k:2
2
6

我們開啟除錯模式,一步步來看可以得出,當在第一次使用這個類來建立物件的時候,java還沒有載入這個類,所以在一開始他是先載入這個類去執行這個類的初始化塊,這個類的函式,建立類的物件,然後我們再根據這個類來建立物件。所以在一開始的時候。載入類-->建立類變數-->執行初始化程式碼塊。

隨後到了真正的建立物件。只要是建立物件,都是通過構造器來建立的。所以new 類()的時候,偵錯程式跳到的第一句是對應的構造器,但是這個時候他只是在說我找到這個構造器了,並沒有執行。隨後java做了裡面所有成員變數空間的建立,但是這個時候還沒有賦值,執行的時候預設初始化,就是都是0。

隨後開始執行程式碼塊,這個時候我們說的初始化程式碼塊,不僅僅是那些被{}在一起的程式碼塊,前面的,對成員變數不通過構造器的賦值也是,所以我們可以認為他做了:

private int i;

{i=8;}的操作

所以這一部分是按照順序執行的,所以我們會看到,要是我們把我們註釋的那部分程式碼塊解開註釋,這個時候輸出的就是:

2

9

在然後,才會執行構造器的東西。

然後再下一次的建立物件,因為類已經在載入過了,所以類的初始化塊就不會再執行了