java类加载知识点考察

以下结果输出和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代码块)类初始化方法只会执行一次。
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/chen462488588/article/details/112910629