一個java類的加載過程

1靜態常量,2靜態方法,3靜態代碼塊,4類的構造函數,5通常常量,6通常方法,7通常代碼塊 java

這些在編譯中的順序是怎樣的,一下將要用代碼來解釋一下: 函數


public class A {

	static int a = 2;                 //定義靜態變量
	
	private static void doTell(){     //靜態方法
		System.out.println("靜態方法"+a);
	}
	
	static{                            //靜態代碼塊
	System.out.println("靜態代碼塊"+a);
    }

	 A(){                              //構造函數
	   System.out.println("構造函數"+a+" "+b);
	  }
	 
	int b = 1;                         //定義通常變量
   
   public void doSay() {              //通常函數方法
	// TODO Auto-generated method stub
     System.out.println("通常函數方法"+a+" "+b); 
   }
   
	{                                  //通常運算
	System.out.println("通常代碼塊"+a+" "+b);
    }
   
   public static void main(String[] args) {
	A a = new A();
	a.doSay();
	A.doTell();
}
}



運行後,打印結果如圖


結果解釋:第一行,靜態代碼塊2,說明靜態常量優先於靜態代碼塊; 測試

              第二行,通常代碼塊2  1,說明通常常量加載優先於通常代碼塊; spa

              第三行,構造函數2 1,說明靜態常量和通常常量優先於構造函數; code

              第四五行,爲方法調用不作比較; 編譯

如今能夠知道的順序有:靜態常量>靜態代碼塊>構造函數; class

                              通常常量>通常代碼塊>構造函數。 變量

如今將測試代碼修改成: 構造函數


public class A {

	static int a = 2;                 //定義靜態變量
	
	private static void doTell(){     //靜態方法
		System.out.println("靜態方法"+a);
	}
	
	static{                            //靜態代碼塊
	System.out.println("靜態代碼塊"+a);
    }

   public static void main(String[] args) {

  }
}



其中只保留的靜態數據和main方法(方法體爲空)


結果以下: 方法

結果解釋:打印結果說明,類A在加載過程當中,就已經將靜態常量和靜態代碼塊執行了,而靜態方法沒有執行,

聯繫以前的測試結果能夠得出結論:


                         靜態常量>靜態代碼塊>通常常量>通常代碼塊>構造函數

而類中的靜態方法和通常方法只有在調用時纔會去執行。

相關文章
相關標籤/搜索