黑马程序员技术交流社区

标题: 单例设计中懒汉式 [打印本页]

作者: HM何伟    时间: 2013-3-25 21:15
标题: 单例设计中懒汉式
为什么
if (s==null)
        {
            Single s=new Single();
        }
少一个Single打印的结果会多两null字符啊
  1. /*
  2.        
  3. 代码如下:
  4. */

  5. class Single{
  6.         private Single()
  7.         {}
  8.         private static Single s=null;
  9.         static  Single getGuide()
  10.         {
  11.                 if (s==null)
  12.                 {
  13.                          s=new Single();
  14.                 }
  15.                 return s;
  16.         }
  17.         public  static void method()
  18.         {
  19.                 System.out.println("安全");
  20.        
  21.         }
  22. }

  23. class SingleDemo{

  24.         public static void main(String[] args){
  25.                 Single s=Single.getGuide();
  26.                 Single s2=Single.getGuide();
  27.                 //Single s3=new Single();
  28.                 System.out.println(s);
  29.                 System.out.println(s2);
  30.                 s.method();
  31.                 s2.method();
  32.                 //System.out.println(s3);
  33.        
  34.         }
  35. }
复制代码

作者: 刘胜寒    时间: 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