java代碼的初始化過程研究

       剛剛在ITeye上看到一篇關於java代碼初始化的文章,看到代碼我試着推理了下結果,雖然是大學時代學的知識了,沒想到還能作對。(看來本身大學時掌握的基礎還算不錯,(*^__^*) 嘻嘻……)可是博主寫的不夠詳細具體,我想在這詳細談一下java代碼的具體初始化過程。java

  首先要清楚,初始化分爲兩個過程:類初始化、對象初始化。函數

  類初始化是指類加載器將類加載到內存時,對類成員的初始化過程,也就是有static修飾的變量。對於加載完的類,它的類變量都會賦一個默認值,即便你定義時就賦值了。好比int類型就是0,引用類型就是null。(語言有點蒼白無力了,我仍是直接上例子吧!)測試

    

public class Test {

	private static int number = 5;
	
	private static Object object = new Object();
}

  讓咱們來分析下這個實例,Test類有兩個類成員變量,當類被加載完後就要進行類的初始化過程,雖然number和object都在定義時被賦予了值,可是他們仍是首先被賦予0和null值,哪何時纔將咱們的5和object對象賦予呢?它是在編譯後通過一個靜態代碼塊賦值。因此他的實際初始化過程相似於以下代碼:spa

public class Test {

	private static int number = 0;
	
	private static Object object = null;
	
	static{
		number = 5;
		object = new Object();
	}
}

  對象初始化是指當咱們建立對象時的初始化過程,它的初始化過程跟類初始化過程很類似,只是多了一個構造函數的過程。直接上代碼:對象

public class Test {

	private  int number = 5;
	
	private  Object object = new Object();
	
	{//這是一個動態代碼塊,現實中不多用到,其實跟直接定義成員變量差很少
		number = 6;
	}
	
	public Test(){
		
	}
}

  表達能力還真是有限,我仍是感受直接上代碼說的清楚,它的實際初始化過程的相似於以下代碼:blog

public class Test {

	private  int number = 0;
	
	private  Object object = null;
	
	public Test(){
		number = 5;
		object = new Object();
		number = 6;
	}
	
}

  你沒有看錯,動態代碼塊直接就沒了,賦值過程都被移到了構造方法中了。變量定義和動態代碼塊同樣都是按照出現的順序移到構造方法中的。內存

   以上就是類初始化過程和對象初始化過程,不知道有沒有說清楚,作幾個小題測試一下吧^_^。(這裏就直接拿剛纔ITeye上看到的代碼爲例吧)get

   

public class JvmTest {
	private static JvmTest JvmTest = new JvmTest();
	private static int count1;
	private static int count2 = 5;

	public JvmTest() {
		count1++;
		count2++;
	}

	public static JvmTest getInstance() {
		return JvmTest;
	}

	public static void main(String[] args) {
		System.out.println("count1=" + JvmTest.count1);
		System.out.println("count2=" + JvmTest.count2);
	}
}

  不知道你能不能經過以上的講解推理出打印什麼值,這裏我把實際初始化過程的代碼發一下:編譯

public class JvmTest {
	private static JvmTest JvmTest = null;//這是系統默認賦值
	private static int count1 = 0;//這是系統默認賦值
	private static int count2 = 0;//這是系統默認賦值

	static{
		JvmTest = new JvmTest();
		count2 = 5;
	}
	
	public JvmTest() {
		count1++;//執行++前值爲0
		count2++;//執行++前值爲0
	}

	public static JvmTest getInstance() {
		return JvmTest;
	}

	public static void main(String[] args) {
		System.out.println("count1=" + JvmTest.count1);
		System.out.println("count2=" + JvmTest.count2);
	}
}

  不早了,準備誰家,你們晚安O(∩_∩)Oclass

相關文章
相關標籤/搜索