Java创建对象的初始化顺序(转载)

来源:互联网 发布:php如何防止sql注入 编辑:程序博客网 时间:2024/06/07 14:56
  1. 初始化块

    初始化块通常写在类的构造方法之前,由花括号括起来,通常包含对成员属性进行初始化的语句;

    初始化块分为instance初始化块和static初始化块,初始化块在构造方法执行之前被执行;

    static初始化块不能访问非statci成员,也不能调用非static方法,并且只在类加载时执行一次;

    初始化块通常用于提取多个构造方法中的公共代码。

    1. 初始化的执行顺序

    (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

原创粉丝点击