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

posted @ 2015-07-21 16:42  jqc  阅读(5633)  评论(1编辑  收藏  举报