java中代碼塊和構造方法以及普通方法的代碼執行順序總結


說實話,這塊真的不好理解啊~都怪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

這就很好理解了吧~

好了 ,

不用謝我, 我是雷鋒!告辭—— 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM