剛剛在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