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

转载于:https://www.cnblogs.com/jqctop1/p/4664912.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值