以下结果输出和static字段以及代码块的先后顺序有关,可参考《深入理解java虚拟机》类加载的“初始化 ” 一节
public class StaticTest {
private static StaticTest s2 = new StaticTest();
static {
System.out.println("static 代码快");
}
private static StaticTest s1 = new StaticTest();
{
System.out.println("构造方法代码块");
}
public static void main(String[] args) {
StaticTest staticTest = new StaticTest();
}
}
疑问
开始会有疑问,类中引用自身对象会不会无限循环创建自身?
答案: 不会
如果不用static 修饰会因为栈溢出而崩溃,相当于递归调用自身的构造方法,
public class StaticTest {
private StaticTest s2 = new StaticTest();
static {
System.out.println("static 代码快");
}
private static StaticTest s1 = new StaticTest();
{
System.out.println("构造方法代码块");
}
public static void main(String[] args) {
StaticTest staticTest = new StaticTest();
}
}
同一个类加载器下,同一个类的clinit(该方法是用来初始化static字段、static代码块)类初始化方法只会执行一次。