关于类加载过程与双亲委派的关系
来源: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回答
-
同学好,首先,你的前面的理解是对的,双亲委派就是看看之前有没有加载过类,如果有则直接载入,如果没有,就会按照你说的一步步来。
此外,针对第二个问题,同学只需要打印当前new出来的Singleton,然后再打印Singileton.getInstance() 然后再打印Singileton.getInstance().getInstance()对比一下就好了
132020-09-18
相似问题