今天正在看ClassLoador的知识点,在网上看相应的面试题,看到一道非常好的题,理解了这道题。.class文件加载的过程也就八九不离十了,话不多说,看题。
public class ShunxuTest {
public static void main(String[] args) {
Singleton singleton = Singleton.getSingleton();
System.out.println("a"+singleton.a);
System.out.println("b"+singleton.b);
}
}
class Singleton {
private static Singleton singleton = new Singleton();
public static int a;
public static int b = 0;
Singleton() {
a++;
b++;
}
public static Singleton getSingleton() {
return singleton;
}
}
您觉得答案应该是多少呢?
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
吗????
?????
?????
?????
?????
?????
其实答案是1 0
给大家解析一下:
类加载器加载一个类时分三步,分别是
1. 找到对应.class文件并且加载
2. i.验证.class的正确性 ii.为静态变量分配空间并赋初始值 iii.将符号引用转换成直接引用
3. 为静态变量赋争取的初始值 & 执行静态块
好,现在我们来看一下执行的流程
首先 为静态变量初始化空间并且赋初始化值 a=0,b=0,singleton=null
然后调用getInsteance 继续调用Singleton()方法,此时 singleton =0x1354346 ,a=1,b=1
再然后为静态变量赋正确的初始化值 a不变 b=0
以上就是解析,希望我的理解对您有帮助~