1. 程式人生 > >JAVA虛擬機器:物件的建立過程

JAVA虛擬機器:物件的建立過程

簡要說明的話,Java物件的建立過程分為下面幾步:

1、執行相關檢查;

2、為物件分配記憶體,將分配到的記憶體空間都初始化為零值;

3、進行構造程式碼塊和建構函式的初始化

 下面詳細介紹這幾個步驟:

1、執行相關檢查

虛擬機器遇到一條new指令時,將會去檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,並檢查這個符號引用代表的類是否已被載入、解析和初試化過,如果沒有,那必須先執行相應的類載入過程;

例:Person p = new Person()

當有這麼一條new指令時,我們先去檢查p這個符號引用是否能在常量池中定位到,然後檢查Person這個類是否已經被載入、解析和初始化,沒有則執行相關的操作;static程式碼塊就是在這一載入過程中被執行;

2、為物件分配記憶體

類載入檢查完後,將為新生物件分配記憶體;

將分配到的記憶體空間都初始化為零值;

如果Person類有繼承父類,在這一步分配記憶體會分配Person類和其父類的記憶體,並先完成Person父類物件的建立

3、進行構造程式碼塊和建構函式的初始化

上一步完成了記憶體空間的初始化後,接著進行構造程式碼塊和建構函式的初始化

看下面的例子再理解一下物件建立的過程

public class test extends Person{
	static {
		System.out.println("子類static程式碼塊");
	}
	{
		System.out.println("子類構造程式碼塊");
	}
	public test() {
		System.out.println("子類構造方法");
	}
	public static void main(String[] args) {
		test t = new test();
	}
}

class Person{
	static{
		System.out.println("父類static程式碼塊");
	}
	{
		System.out.println("父類構造程式碼塊");
	}
	Person(){
		System.out.println("父類構造方法");
	}
}

父類static程式碼塊
子類static程式碼塊
父類構造程式碼塊
父類構造方法
子類構造程式碼塊
子類構造方法
從結果可以看出:

1、static程式碼塊是最先執行,子類和父類的static程式碼塊都是在類載入的過程中就執行的;

2、父類物件的建立在子類物件之前完成,所以父類的構造程式碼塊和構造方法先執行,執行完後再執行子類的;

3、構造程式碼塊是在建構函式之前執行的,其實整個物件的載入順序是:父類和子類的static程式碼塊、父類中的變數、程式碼塊、構造方法,然後再初始化子類變數、程式碼塊、構造方法。其中變數最先初始化建立,其次是程式碼塊,構造方法最後建立;