Java 靜態語句塊、語句塊、構造函數執行順序

package test;    
      
  class Parent{    
      static String name = "hello";    
      {    
          System.out.println("3 parent  block");    
      }    
      static {    
          System.out.println("1 parent static block");    
      }    
      public Parent(){    
          System.out.println("4 parent constructor");    
      }    
  }    
      
  class Child extends Parent{    
      static String childName = "hello";    
      {    
          System.out.println("5 child  block");    
      }    
      static {    
          System.out.println("2 child static block");    
      }    
      public Child(){    
          System.out.println("6 child constructor");    
      }    
  }    
      
  public class StaticIniBlockOrderTest {    
      
      public static void main(String[] args) {    
          new Child();//語句(*)    
      }    
  }  
分析:對象的初始化順序:首先執行父類靜態的內容,父類靜態的內容執行完畢後,接着去執行子類的靜態的內容,當子類的靜態內容執行完畢之後,再去看父類有沒有非靜態代碼塊,如果有就執行父類的非靜態代碼塊,父類的非靜態代碼塊執行完畢,接着執行父類的構造方法;父類的構造方法執行完畢之後,它接着去看子類有沒有非靜態代碼塊,如果有就執行子類的非靜態代碼塊。子類的非靜態代碼塊執行完畢再去執行子類的構造方法。總之一句話,靜態代碼塊內容先執行,接着執行父類非靜態代碼塊和構造方法,然後執行子類非靜態代碼塊和構造方法。

而且子類的構造方法,不管這個構造方法帶不帶參數,默認的它都會先去尋找父類的不帶參數的構造方法。如果父類沒有不帶參數的構造方法,那麼子類必須用supper關鍵子來調用父類帶參數的構造方法,否則編譯不能通過。



本文轉自:http://blog.csdn.net/edward_qing_lee/article/details/8067492

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章