Java創建對象的初始化順序


  1. 初始化塊

   初始化塊通常寫在類的構造方法之前,由花括號括起來,通常包含對成員屬性進行初始化的語句;

   初始化塊分為instance初始化塊和static初始化塊,初始化塊在構造方法執行之前被執行;

   static初始化塊不能訪問非statci成員,也不能調用非static方法,並且只在類加載時執行一次;

   初始化塊通常用於提取多個構造方法中的公共代碼。

   2. 初始化的執行順序

  (1)在初次new一個Child類對象時,發現其有父類,則先加載Parent類,再加載Child類。

  (2)加載Parent類:

         初始化Parent類的static屬性,賦默認值;

         執行Parent類的static初始化塊;

  (3)加載Child類:

     初始化Child類的static屬性,賦默認值;

   執行Child類的static初始化塊;

  (4)創建Parent類對象:

         初始化Parent類的非static屬性,賦默認值;

     執行Parent類的instance初始化塊;

     執行Parent類的構造方法;

  (5)創建Child類對象:

     初始化Child類的非static屬性,賦默認值;

   執行Child類的instance初始化塊;

     執行Child類的構造方法;

  后面再創建Child類對象時,就按照順序執行(4)(5)兩步。

  

class Parent
{
  private static int ps;
  private int pv;
  
  static
  {
     System.out.println("parent static init block");
  }
  
  {
     System.out.println("parent init block");
  }
  
  Parent()
  {
     System.out.println("parent constructor"); 
  }
  
}

class Child extends Parent
{    
    private static int cs;
    private int cv;
      
    static
    {
         System.out.println("child static init block");
    }
      
    {
         System.out.println("child init block");
    }
      
    Child()
    {
         System.out.println("child constructor"); 
    }
 
}

public class Test
{
   public static void main(String[] args)
   {
       new Child();
       new Child();
   }
}

 

 執行結果是:     

  parent static init block

  child static init block

  parent init block

  parent constructor

  child init block

  child constructor

  parent init block

  parent constructor

  child init block

  child constructor

 

 

參考資料 《Java核心技術》


免責聲明!

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



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