String a 与 String a=null 有什么区别

xxy_aldrich 2011-11-16 10:40:36
class Test{
public static void main(String args[]){
String a = null;
String b;
String c = "abc";
System.out.println(a + c); //打印结果是nullabc
System.out.println(b + c); //直接编译报错
}
}
a,b 都是在栈中分配,堆中都没分配,为何a可以用,b不可以用,高手帮忙解答下什么原因?
...全文
846 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
LucEaspe 2011-11-20
  • 打赏
  • 举报
回复
就想有一系列的编号String a,b,c,我们可以用编号来指定某个房间,例如a房间里面是存abc的 a = "abc",b房间里面是空的 b = null, c没有指定任何房间 String c;。
此时你要获取C房间里面的内容,当然是错的,因为没有指定房间。
沭灬望月 2011-11-20
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 xxy_aldrich 的回复:]

引用 35 楼 xxy_aldrich 的回复:

引用 32 楼 mu_wangyue 的回复:

class Test{
public static void main(String args[]){
String a = null; //直接输出:null
String c = "null"; //直接输出:null

System.out.println(a.equa……
[/Quote]

非常感谢
xxy_aldrich 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 xxy_aldrich 的回复:]

引用 32 楼 mu_wangyue 的回复:

class Test{
public static void main(String args[]){
String a = null; //直接输出:null
String c = "null"; //直接输出:null

System.out.println(a.equals(c)); //false
System.out.……
[/Quote]
a 输出的是null,你可以去看下jdk的String类源码,里面对String打印,有句是if(str == null) return "null";这里是jdk里已经处理过了(我想你疑惑点应该是在这里)。a为null是不分配内存空间,所以你调用equals的时候就会报空指针异常。
a == c 比较的是地址,a相当于空地址,c的地址是指向null字符串的地址,所以会报错
这里红色的地方说错了,第一处不是String打印,是重载的valueOf方法,有对null进行处理。
第二处,是不分配堆内存空间,第三处是不是报错,是打出来为false
qi604388041 2011-11-18
  • 打赏
  • 举报
回复
csdn连帖子都不能修改,真是太恶心了。。。
热带鱼2020 2011-11-17
  • 打赏
  • 举报
回复
String a; 只写一个这句 eclipse 都要报错 object maynot be initialized .
然后改成 String a = null ; 才能通过


xxy_aldrich 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 mu_wangyue 的回复:]

class Test{
public static void main(String args[]){
String a = null; //直接输出:null
String c = "null"; //直接输出:null

System.out.println(a.equals(c)); //false
System.out.println(a == c)……
[/Quote]
a 输出的是null,你可以去看下jdk的String类源码,里面对String打印,有句是if(str == null) return "null";这里是jdk里已经处理过了(我想你疑惑点应该是在这里)。a为null是不分配内存空间,所以你调用equals的时候就会报空指针异常。
a == c 比较的是地址,a相当于空地址,c的地址是指向null字符串的地址,所以会报错。
ZhangNan20100811 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 alike188 的回复:]
String b没有初始化赋值,很容易报空指针之类的错的了,你需要赋值。
[/Quote]
+1
xxy_aldrich 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 dongvsning 的回复:]

我怎么分不清堆与栈的关系,
如果不理解,对以后的编程有没有什么大的影响啊?
求大神 给解释一下
[/Quote]
建议:可以多想想为什么是这样子的,你编程只是应用是不影响,要深入理解的话,还是多了解一些底层的原理
xxy_aldrich 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 fainfy 的回复:]

引用 23 楼 xxy_aldrich 的回复:

引用 19 楼 renyuanchunby 的回复:

lz给你个链接,有详细的字符串池和字符串堆内存分配的解释
http://wenku.baidu.com/view/0f8c8b1efc4ffe473368abed.html

Object o; 这种写法只是分配一个引用而已。
Object o = null; 这么写则是给……
[/Quote]
知道类初始化的时候,会把外面Object o 初始化为null,另外你的m方法少了括号了。
这种还说不上是真理,只是java虚拟机的规范而已,只是为了避免这类错误的发生。
沭灬望月 2011-11-17
  • 打赏
  • 举报
回复
class Test{
public static void main(String args[]){
String a = null; //直接输出:null
String c = "null"; //直接输出:null

System.out.println(a.equals(c)); //false
System.out.println(a == c); //false
}
}

谁能给我解释下:
为什么 a 输出的是 null
既然是 null ,为什么 a.equals(c) 为 false
CloudX2019 2011-11-17
  • 打赏
  • 举报
回复
String a;这个只是告诉你有一个变量叫做a
String a = null;这个告诉你有一个变量a他没有值,是空值
crazywolf 2011-11-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hanjiaming 的回复:]

String a; 申明一个string类型的 a,即没有在申请内存地址,更没有在内存任何指向引用地址;

String a = null ; 申明一个string类型的 a,同时在内存里申请了一个地址,但是该地址不指向任何引用地址;

String a = "" ;申明一个string类型的 a,既在内存里申请了地址,该地址又指向一个引用该字符串的引用地址;

一般来说 字符……
[/Quote]

看到这个都不用回答了!完全同意
arikara 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 xxy_aldrich 的回复:]
class Test{
public static void main(String args[]){
String a = null;
String b;
String c = "abc";
System.out.println(a + c); //打印结果是nullabc
System.out.println(b + c); //直接编译报错
}
}……
[/Quote]
static 方法中不可以调用未实例的对象
String a=null 表明a指向了null,被事例化了。
所以a 可以用 b 不能用
fainfy 2011-11-16
  • 打赏
  • 举报
回复
楼主记住一句话就行了,就是方法里面“定义”的变量,需要手动初始化,否则不能使用
在Java中你把它当做真理都行,没有疑问。
xxy_aldrich 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 renyuanchunby 的回复:]

String s ="a";与String s = new String("a");
有本质的区别:前者是在字符串池里写入一个字符‘a’,然后用s指向它。
后者是在堆上创建一个内容为“a”的字符串对象。
String s ="a"; //于栈上分配内存
String s = new String("a"); //于堆上分配内存
String a = nu……
[/Quote]
String a = null;赋予的值为null,是分配的空间中存储的值为null值。(是为a引用在栈中(字符串池里)分配的值为null值)
字符串池,这个不是在栈中,是在堆中,堆中有块区域叫方法区,方法区会存储编译后的class信息,方法区中的一个重要部分,也是静态分配最典型的例子,是常量池(应该就是你说的字符串池),源代码中的命名常量、String常量和static 变量保存在其中。(我记得是这样子的)
最后这句话在分配的空间中存储的值为null值,分配的空间指的是什么?另外问下大大在堆中有分配内存的话,是不是可以用equal调用?
xxy_aldrich 2011-11-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 woaidoudoue 的回复:]

请参考Thinking in java第四章,初始化的相关知识。
String a 与 String a=null 的区别就在于后面的初始化了
[/Quote]
java编程思想是第4版的第4章么?2楼大大能讲的详细点么,我只发现类中成员变量的初始化,静态变量的初始化等等,没发现关于String的初始化讲解
加嘞个油 2011-11-16
  • 打赏
  • 举报
回复
String b,只是声明了一个String 类型的b 变量,没有初始化赋值,直接调用会报错。
renyuanchunby 2011-11-16
  • 打赏
  • 举报
回复
String s ="a";与String s = new String("a");
有本质的区别:前者是在字符串池里写入一个字符‘a’,然后用s指向它。
后者是在堆上创建一个内容为“a”的字符串对象。
String s ="a"; //于栈上分配内存
String s = new String("a"); //于堆上分配内存
String a = null;赋予的值为null,是分配的空间中存储的值为null值。(是为a引用在栈中(字符串池里)分配的值为null值)
alike188 2011-11-16
  • 打赏
  • 举报
回复
String b没有初始化赋值,很容易报空指针之类的错的了,你需要赋值。
renyuanchunby 2011-11-16
  • 打赏
  • 举报
回复
String b;只是定义了一个String类型变量 b 并没有赋初始值。java默认必须给局部变量赋初始值(降低风险),否则编译通不过。

String a = null;赋予的值为null,是分配的空间中存储的值为null值。
加载更多回复(19)

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧