运行得到的结果应该是:
Parent static initialization
Child static initialization
Parent initialization
Parent constructor
Child initialization
Child constructor
Parent initialization
Parent constructor
Child initialization
Child constructor
nChildStaticValue =7,nChildValue = 7
初始化顺序是:
(1) 先是父类的static变量和static初始化块 (因为在TestFinalize 的main中需要使用Child这个类,所以JVM才去加载它,结果发现它继承自Parent,那么就会发现需要先加载Parent这个class,所以我们会发现是 Parent的static field被初始化&static initialization 先执行,然后child的 static field被初始化&static initialization 执行,static field和static块执行的顺序则是按照它在代码里面书写的顺序从上到下执行的)
(2)然后是子类的static变量和static初始化块
(3)父类的实例变量、初始化块 (initialization会在每次new一个对象的时候都执行,它和constructor的区别见下面的叙述)
(4)父类的构造方法
(5)子类的实例变量、初始化块
(6)子类构造方法
初始化块(Initialization)和构造器(Constructor)
从某种程度上来讲,可以理解为初始化块是构造器的补充,因为初始化快总是在构造器之前执行,同样也可以对对象初始化.
与构造器不同的是:初始化块只能执行一段固定的代码,不能够像构造器一样接受参数,而且是对类的所有的对象进行初始化.
跟构造器一样的,程序在执行的时候不仅会执行当前类的初始化快和构造器,会一直追溯到object类的初始化快和构造器.先执行父类的初始化块和构造器(先初始化块,再构造器),然后再执行当前类的初始化块和构造器.