Java创建对象的初始化顺序

时间:2021-07-10 19:43:22

  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核心技术》