发现一道有趣的有关ClassLoador的题

来源:互联网 发布:一叶而知四季 编辑:程序博客网 时间:2024/05/16 13:38

今天正在看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

以上就是解析,希望我的理解对您有帮助~

0 0