A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM何伟 中级黑马   /  2013-3-25 21:15  /  1741 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么
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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

倒序浏览
你看毕向东的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();
}
会出现两个地址值。
兄弟 下次把问题描述的清楚点。。

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
黄玉昆 + 1
HM何伟 + 3 赞一个!

查看全部评分

回复 使用道具 举报
似水像火 发表于 2013-3-27 09:53
你看毕向东的25天视频,第6天的。你这个
if (s==null)
{

那我这也没出现两个地址值啊??
回复 使用道具 举报

     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个内存地址值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马