下面以代码+运行结果+原因描述的形式来说明该执行顺序:
代码:
package test;
class Root {
static {
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root() {
System.out.println("Root的无参构造器");
}
}
class Mid extends Root {
static {
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid() {
System.out.println("Mid的无参构造器");
}
public Mid(String msg) {
this();
System.out.println("Mid的带参构造器,其参数值: " + msg);
}
}
class Leaf extends Mid {
static {
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf() {
super("我是一只可爱的参数");
System.out.println("Leaf的无参构造器执行");
}
}
public class test {
public static void main(String[] args) {
new Leaf();
new Leaf();
}
}
截图:
描述:
1.一旦Leaf类初始化成功后,Leaf类会在该虚拟机里一直存在,因此第二次创建Leaf实例时,无需再次对Leaf类进行初始化。
2.系统在类初始化阶段,会先执行最顶层父类的静态初始化块,然后一次向下,直到执行当前类的静态初始化块。
3.对象初始化阶段,(如果调用到最上层的构造器,则)会先执行最顶层父类的初始化块、构造器,然后向下依次执行被调用的父类的初始化块、构造器..最后才执行Leaf类的初始化构造器。
参考:疯狂java讲义,请勿随意复制转载