private Single() {} private static Single s=null; (c) static Single getGuide() { if (s==null) (a) { Single s=new Single(); (b) } return s; }
(1)
执行Single s=Single.getGuide(); 这个的时候,Single类要先加载,,Single类一加载的时候,方法区里面就有了Single类的空间了,Single类的空间里面有静态的s变量,还有这方法getGuide() ,这个s最先进来.他有个值,这值是null,当你执行getGuide()方法的时候,这方法运行时在内存中建立对象new Single(),,,并把对象的内存地址值赋给s,,注意(b)处的s和(a)处的s不是同一个s,,,也就是此时栈内存里面有2个引用变量都是s,一个s指向new Single()对象,另一个s没有任何指向,,,, return s返回的s是(a)处的s由于(a)处的s为null,,所以 System.out.println(s);会返回null,,,
(2)
当执行Single s2=Single.getGuide(); 时程序执行原理和(1)处一样,所以这里也会返回一个null,,,
所以你得程序运行结果会出现2个null,,,
(3)
当你的代码为:
private Single()
{}
private static Single s=null; (c)
static Single getGuide()
{
if (s==null) (a)
{
s=new Single(); (b)
}
return s;
}
(m)
执行 Single s=Single.getGuide(); 这个的时候,Single类要先加载,,Single类一加载的时候,方法区里面就有了Single类的空间了,Single类的空间里面有静态的s变量,还有这方法 getGuide() ,这个s最先进来.他有个值,这值是null,当你执行getGuide()方法的时候,这方法运行时在内存中建立对象new Single(),,,并把对象的内存地址值赋给s,, 此时栈内存里面只有一个s,,并且这个s指向了new Single() 对象,, return s返回的s是new Single(), 对象的内存地址值,,
(n)
当执行 Single s2=Single.getGuide(); 时 (a)处的s不为null,,getGuide() 他会返回原来那个s的值,,所以s2 的值就是原来s的值,
此时内存里就只有一个new Single();对象,,,
所以结果就是返回2个内存地址值
|