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) { } }
結果以下: 方法
結果解釋:打印結果說明,類A在加載過程當中,就已經將靜態常量和靜態代碼塊執行了,而靜態方法沒有執行,
聯繫以前的測試結果能夠得出結論:
靜態常量>靜態代碼塊>通常常量>通常代碼塊>構造函數
而類中的靜態方法和通常方法只有在調用時纔會去執行。