以下代码的输出结果是?
public class B {
public static B b1 = new B();
public static B b2 = new B();
{
System.out.println("构造块");
}
static {
System.out.println("静态块");
}
public static void main(String[] args) {
B t = new B();
}
}
正确答案:构造块 构造块 静态块 构造块
解析:由static申明的,JVM在加载类的时候,会执行一次,执行顺序是从上到下依次执行。类中直接{}申明的构造块,每创建一个对象执行一次。此题JVM在加载类的时候从上到下先执行三个static,又因为b1,b2是创建的对象,要执行构造块,所以先输出两个“构造块”,然后是“静态块”,类加载完毕执行main函数,main函数创建了一个对象t,执行一次构造块,又输出了“构造块”,因此答案是“构造块 构造块 静态块 构造块”。如果把静态块放到创建b1对象之前,那么输出结果将是“静态块 构造块 构造块 构造块”。
JVM初始化类的先后顺序:静态优先,父类优先。
静态变量/静态初始化块 > 普通变量/普通初始化块 > 构造器