java静态初始化块、普通初始化块、构造器执行顺序

时间:2021-09-15 17:22:39

下面以代码+运行结果+原因描述的形式来说明该执行顺序:

代码:

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();
}
}

截图:
java静态初始化块、普通初始化块、构造器执行顺序

描述:
1.一旦Leaf类初始化成功后,Leaf类会在该虚拟机里一直存在,因此第二次创建Leaf实例时,无需再次对Leaf类进行初始化。
2.系统在类初始化阶段,会先执行最顶层父类的静态初始化块,然后一次向下,直到执行当前类的静态初始化块。
3.对象初始化阶段,(如果调用到最上层的构造器,则)会先执行最顶层父类的初始化块、构造器,然后向下依次执行被调用的父类的初始化块、构造器..最后才执行Leaf类的初始化构造器。

参考:疯狂java讲义,请勿随意复制转载