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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李玉生 中级黑马   /  2012-10-4 19:00  /  2243 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

...
String str = null;
     str+="a";
System.out.println(str);
输出:nulla.
...
String str = "";
   str += "a";
System.out.println(str);
输出:a.

从上面的例子可以看出null与""是有区别的:
   null 代表声明了一个空对象,
"" 代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。
总结:
null 是代表空对象 ,"" 是代表空字符串
String str = null; //null 是没有被分配内存空间;
String str = ""; // "" 是分配了内存空间,存放了一个空字符串对象;
String str;  表示分配了内存空间,但没有存放任何对象。
  

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
兄弟,没有说到点子上。
String str = null;
     str+="a";
System.out.println(str);
输出:nulla.

根本原因是 String重写了 Object的 toString()方法。
String str = null;
输出str的值 已经是 null了。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
夏诗瑶 发表于 2012-10-4 19:11
兄弟,没有说到点子上。
String str = null;
     str+="a";

咳咳,我无意冒犯,但是~~你说的也有问题~~

为什么有问题~~我们做一个小实验~~

public class Test {
        public static void main(String[] args) throws Exception {
                String string = null;
                System.out.println(string.toString());
        }
}

结果出现空指针异常~~也就是说~~并不是你说的调用了.toString()方法~


然后我Debug了一下~~

发现了打印null原因~~

下面是关键代码



懂了吧~


点评

哥们,多想是好事,原因且听我楼下分解。  发表于 2012-10-4 20:01

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
String是字符串类型,定义的是一个字符串类型,null在这里根本就是一个字符串。
class ceshi
{
        public static void main(String[] args)
        {
                String str = null;
       // str+="a";
        System.out.println(str);
                System.out.println("Hello World!");
        }
}
这段代码的输出结果是null,证明了我的说法。
所以取消掉注释的输出结果也就不难解释了,
class ceshi
{
        public static void main(String[] args)
        {
                String str = null;
        str+="a";
        System.out.println(str);
                System.out.println("Hello World!");
        }
}
这个输出的自然就是nulla。
而后面的代码就更没有什么可比性了,就是一个空字符串和字符串“a”的简单组合,输出a自然不奇怪了。
null在这里根本就不是对引用句柄的赋值,所以意义跟引用句柄里的赋值为空是不一样的。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
夏诗瑶 发表于 2012-10-4 19:11
兄弟,没有说到点子上。
String str = null;
     str+="a";

咳咳,然后我做了一个更有意思的实验~ 你可能会说我无聊了~~

public static void main(String[] args) throws Exception {
                String string = null;
                System.out.println(string);//刚才我们看到了string 被赋值为 "null";
                System.out.println(string.toString());
        }


然后我就觉得我可能发现了sun公司的漏洞,擅自把穿进去的null赋值了~~

结果我发现我还是太年轻,结果还是会抛出空指针异常,在打印完了后~~他又把string 变成 null了~


点评

你还是太年轻了。 可是我已经老了,还在学。55555555.  发表于 2012-10-4 20:02
回复 使用道具 举报
本帖最后由 夏诗瑶 于 2012-10-4 20:06 编辑
黄小贝 发表于 2012-10-4 19:54
咳咳,然后我做了一个更有意思的实验~ 你可能会说我无聊了~~

public static void main(String[] args) t ...


其实吧,你应该是没真正理解 第一个为什么输出 null

String的 toString()方法 是这么描述的 返回此对象本身(它已经是一个字符串!)。 也就是说重点是,返回的虽然是字符串,可返回的还是一个对象。

第二个 空对象,当然没有toString方法了。
回复 使用道具 举报
大伙的讨论,真让我学了不少
回复 使用道具 举报
本帖最后由 黄小贝 于 2012-10-4 20:12 编辑
夏诗瑶 发表于 2012-10-4 20:00
其实吧,你应该是没真正理解 第一个为什么输出 null

String的 toString()方法 是这么描述的 返回此对象 ...

可能你误会了,
我的意思是,传入的参数是一个指向null的引用,sun公司的print方法的处理办法是,让它指向一个 "null"的string对象,等于就变成了print("null"),在这之后,才会调用toString方法打印,等打印完了后,再让这个引用重新指向null





回复 使用道具 举报
夏天 初级黑马 2012-10-4 20:15:04
9#
黄小贝 发表于 2012-10-4 20:10
可能你误会了,
我的意思是,传入的参数是一个指向null的引用,sun公司的print方法的处理办法是,让它指向 ...

嗯,你说得对。我真误会你意思了。

其实 String也是一个特例,默认就会调用toString方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马