Java创建对象的初始化顺序

本文深入解析Java中初始化块的使用,包括instance初始化块和static初始化块的区别与执行时机,以及在继承关系中初始化的详细执行顺序。通过实例代码,清晰展示从父类到子类,静态到非静态成员的初始化过程。

  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值