1. 程式人生 > >java虛擬機器如何跑一個程式 從整體上看一個程式 詳細實驗

java虛擬機器如何跑一個程式 從整體上看一個程式 詳細實驗

如題,本文就是通過實驗來測試。
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");
	  
  }
}

執行結果:
我們可以看到

  1. 當執行main時,java虛擬機器會初始化類,包括靜態塊並且為靜態變數賦值。
  2. 例項化時,會先為例項變數賦值,執行例項塊,最後呼叫建構函式
  3. 一個類只會初始化一次
    繼續驗證初始化類的時候:
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();
  }
}

執行結果:
在這裡插入圖片描述
可以發現這裡並沒有被回收,我想應該要等全部結束後才能回收。
最後,我想說點題外話:真正的大師應該永保一顆謙遜之心,希望用此來提醒自己。