今天正在看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
以上就是解析,希望我的理解对您有帮助~
新闻热点
疑难解答