黑马程序员技术交流社区
标题:
单例设计中懒汉式
[打印本页]
作者:
HM何伟
时间:
2013-3-25 21:15
标题:
单例设计中懒汉式
为什么
if (s==null)
{
Single s=new Single();
}
少一个Single打印的结果会多两null字符啊
/*
代码如下:
*/
class Single{
private Single()
{}
private static Single s=null;
static Single getGuide()
{
if (s==null)
{
s=new Single();
}
return s;
}
public static void method()
{
System.out.println("安全");
}
}
class SingleDemo{
public static void main(String[] args){
Single s=Single.getGuide();
Single s2=Single.getGuide();
//Single s3=new Single();
System.out.println(s);
System.out.println(s2);
s.method();
s2.method();
//System.out.println(s3);
}
}
复制代码
作者:
刘胜寒
时间:
2013-3-27 09:53
你看毕向东的25天视频,第6天的。你这个
if (s==null)
{
Single s=new Single();
}
好像是把s重新定义了一次。就是把s的值改变了
为什么、
if (s==null)
{
Single s=new Single();
}
这样打印会出现两个null;
if (s==null)
{
s=new Single();
}
会出现两个地址值。
兄弟 下次把问题描述的清楚点。。
作者:
HM何伟
时间:
2013-4-1 00:06
似水像火 发表于 2013-3-27 09:53
你看毕向东的25天视频,第6天的。你这个
if (s==null)
{
那我这也没出现两个地址值啊??
作者:
聂斌
时间:
2013-4-1 02:11
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个内存地址值
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2