关于类加载过程与双亲委派的关系

来源:6-6 ClassLoader的双亲委派机制

qq_君君晨晨_0

2020-09-13

主要是有两个疑问

1.在网上看到类加载过程一般分为三个比较大的阶段,分别是加载阶段、连接阶段和初始化阶段
加载阶段:负责查找并读取类的二进制文件
连接阶段:
(1)验证,确保类文件的正确性。
(2)准备:为静态变量分配内存,并且为其初始化默认值。
(3)把类中的符号引用转换为直接引用。
初始化阶段:为类的静态变量赋予正确的初始值。

问题:
那么类的双亲委派发生在这三个阶段的哪个阶段呢?个人猜想它们的关系是否是双亲委派选择出一个ClassLoader来进行上面的加载操作,如选择根加载器进行上面的三个阶段的操作。
如果猜想是正确的话,那么我还在网上看到了每个类或者接口被Java程序首次主动使用时才会对其进行初始化。
那么最终的流程是不是就是这样的,当一个类被new之后,根据双亲委派机制选择类加载器进行类的加载,然后类的加载过程如上面所示需要加载阶段、连接阶段和初始化。

2.我在网上看到这么一段代码

​
public class Singleton {
    private static Singleton instance = new Singleton();
    private static int x=0;
    private static int y;

    private Singleton(){
        x++;
        y++;
    }

    public static  Singleton getInstance()
    {
        return instance;
    }

    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        System.out.println(singleton.x);
        System.out.println(singleton.y);
    }
}

​

想知道为什么这段代码不会报错呢,我的想法是这样的,执行main函数时会导致Singleton的加载,new一个类,也会导致类的加载,所以这样会不会导致一个循环,即:

因为main,所以加载Singleton -> 检测到类变量里new了Singleton,Singleton没加载完,重新加载Singleton->检测到类变量里new了Singleton,Singleton没加载完,重新加载Singleton->一直这样循环下去

如果不是这样的话,那是因为new的话仅仅是开辟了一个地址,而没有进行更进一步的实例化么,如果是的化,那么地址大小是怎么算出来的,这样的嵌套,地址大小永远算不出来啊

写回答

1回答

翔仔

2020-09-13

同学好,首先,你的前面的理解是对的,双亲委派就是看看之前有没有加载过类,如果有则直接载入,如果没有,就会按照你说的一步步来。

此外,针对第二个问题,同学只需要打印当前new出来的Singleton,然后再打印Singileton.getInstance() 然后再打印Singileton.getInstance().getInstance()对比一下就好了 

1
3
qq_君君晨晨_0
回复
翔仔
好滴,谢谢老师
2020-09-18
共3条回复

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程