黑马程序员技术交流社区

标题: 解说java中null与""的区别 [打印本页]

作者: 李玉生    时间: 2012-10-4 19:00
标题: 解说java中null与""的区别
...
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;  表示分配了内存空间,但没有存放任何对象。
  

作者: 夏天    时间: 2012-10-4 19:11
兄弟,没有说到点子上。
String str = null;
     str+="a";
System.out.println(str);
输出:nulla.

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

作者: 黄小贝    时间: 2012-10-4 19:42
夏诗瑶 发表于 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 19:45
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在这里根本就不是对引用句柄的赋值,所以意义跟引用句柄里的赋值为空是不一样的。
作者: 黄小贝    时间: 2012-10-4 19:54
夏诗瑶 发表于 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了~



作者: 夏天    时间: 2012-10-4 20:00
本帖最后由 夏诗瑶 于 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:03
大伙的讨论,真让我学了不少
作者: 黄小贝    时间: 2012-10-4 20:10
本帖最后由 黄小贝 于 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
黄小贝 发表于 2012-10-4 20:10
可能你误会了,
我的意思是,传入的参数是一个指向null的引用,sun公司的print方法的处理办法是,让它指向 ...

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

其实 String也是一个特例,默认就会调用toString方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2