類的靜態塊在類加載時候執行,執行早于構造函數,并且只執行一次。
下面這個例子可以幫助理解:
1 package untility; 2 3 public class A { 4 // 靜態塊 5 static { 6 A c ; 7 System.out.PRintln(200); 8 c = new A(); 9 i = 10;10 }11 12 public static int i;13 public int j;14 15 public A() {16 System.out.println(A.i);17 System.out.println(j);18 }19 20 public static void main(String[] args) {21 A a = null;22 System.out.println(100);23 a = new A();24 //A b = new A();25 }26 }運行結果:
20000100100
解析:
程序從main方法進去,執行到21行代碼加載類,然后執行static模塊,繼續執行到第6行,再次加載類,再次運行到static模塊,此時第6行已經被執行過一次,所以不會再被執行(寫完Java類的靜態塊の二發現這里的描述是有問題的,這里不會重復加載A類,只會重復往下執行第7行),然后執行第7行,所以第一個被打印出來是200,然后執行第8句的構造函數(沒有執行到第9句,所以i和j都是0),打印出來2個0,然后繼續執行static模塊中的第9句,此時i=10,到此加載類完成,然后繼續執行21行的=null語句,在執行22行的打印,輸出100,最后執行第23行的構造函數,打印出來10 0(因為i是靜態的)。
新聞熱點
疑難解答