java虛擬機器如何跑一個程式 從整體上看一個程式 詳細實驗
阿新 • • 發佈:2018-11-07
如題,本文就是通過實驗來測試。
java虛擬機器什麼時候初始化一個類?
public class ClassLoaderTest{ static { System.out.println(" 執行靜態 塊 static block "); } public static int age=getAge(); public String str=getString(); public ClassLoaderTest(){ System.out.println("執行 構造方法 ClassLoaderTest()"); } public static int getAge(){ System.out.println("執行 getAge() ,給類變數age賦值"); return 1; } public static String getString(){ System.out.println(" 執行 getString(),給例項變數str賦值"); return "String "; } { System.out.println(" 執行例項 塊 block "); } public static void main(String[] args){ ClassLoaderTest c1; System.out.println("before new1"); c1=new ClassLoaderTest(); System.out.println("after new1"); ClassLoaderTest c2; System.out.println("before new2"); c2=new ClassLoaderTest(); System.out.println("after new2"); } }
執行結果:
我們可以看到
- 當執行main時,java虛擬機器會初始化類,包括靜態塊並且為靜態變數賦值。
- 例項化時,會先為例項變數賦值,執行例項塊,最後呼叫建構函式
- 一個類只會初始化一次
繼續驗證初始化類的時候:
public class Test{ public static void main(String[] args){ ClassLoaderTest c1; System.out.println("before new1"); c1=new ClassLoaderTest(); System.out.println("after new1"); ClassLoaderTest c2; System.out.println("before new2"); c2=new ClassLoaderTest(); System.out.println("after new2"); } }
執行結果:
明顯發現執行結果不同,在一次證明了只有main方法的主類會被先初始化
並且我們深入研究這個結果:發現宣告語句並沒有初始化類的效果。
繼續深入研究,初始化的這個類什麼時候會被回收?
public class Test{ public void test(){ ClassLoaderTest c1; System.out.println("before new1"); c1=new ClassLoaderTest(); System.out.println("after new1"); } public void test2(){ ClassLoaderTest c2; System.out.println("before new2"); c2=new ClassLoaderTest(); System.out.println("after new2"); } public static void main(String[] args){ Test t1=new Test(); t1.test(); t1.test2(); } }
執行結果:
可以發現這裡並沒有被回收,我想應該要等全部結束後才能回收。
最後,我想說點題外話:真正的大師應該永保一顆謙遜之心,希望用此來提醒自己。