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