說實話,這塊真的不好理解啊~都怪jvm 執行順序搞這么復雜,哼╭(╯^╰)╮ 但是 我們能怎么辦,只能研究唄!!!
!:首先,毫無置疑的,靜態代碼塊在加載時就執行了,所以肯定是最先執行的。。。。
2:老師是不是說過,非靜態代碼塊是在每次實例化對象時被調用的,那問題就來了,是非靜態代碼塊中的內容先執行的,還是構造方法中的內容執行的呢?
其實:在Child Child = new Child()時,new Child()時就會創建一個對象了,但是這個對象還不會執行構造方法中的內容,然后帶着這個創建的這個對象去執行非靜態代碼塊中的 內容,執行完后,就去執行構造方法中的內容了,重點來了,其實在執行非靜態代碼塊之前,會帶着這個對象執行類中的成員變量部分,因為已經有了對象,所以就有了依附於對象的這些屬性,那么這時這些屬性的初始值就是這些屬性的數據類型初始值,如果這些屬性被賦值了,然后再被賦值。其實順序就是:
用new創建並初始化對象步驟:
給對象的實例變量(非“常量”)分配內存空間,默認初始化成員變量;
成員變量聲明時的初始化;
初始化塊初始化(又稱為構造代碼塊或非靜態代碼塊);
構造方法初始化
下面的代碼會幫助你理解
1 package thisTest; 2 3 public class Child { 4 5 private static String name; 6 7 static { 8 System.out.println("我是靜態代碼塊!!!!!!所以我不能用this~"+name); 9 } 10 11 { 12 System.out.println(this+"我是動態代碼塊"+this.name); 13 } 14 public Child(String name) { 15 this.name = name; 16 System.out.println(this+"我是構造方法"+this.name); 17 } 18 19 public static void main(String[] args) { 20 Child child=new Child("張三"); 21 System.out.println(child+"普通方法"+child.name); 22 } 23 }
輸出結果:
我是靜態代碼塊!!!!!!所以我不能用this~null
thisTest.Child@52e922我是動態代碼塊null
thisTest.Child@52e922我是構造方法張三
thisTest.Child@52e922普通方法張三
執行的順序為
11111111111111111111111
2222222222222222222222222222
3333333333333333333333333
444444444444444444444444444444
這就很好理解了吧~
好了 ,
不用謝我, 我是雷鋒!告辭——