黑马程序员技术交流社区

标题: String类创建对象小知识点 [打印本页]

作者: HM张勇    时间: 2013-6-2 20:44
标题: String类创建对象小知识点
本帖最后由 HM张勇 于 2013-6-5 23:05 编辑

毕老师第13天的01课程中,关于
  1. //问题:两句话的区别?
  2. String s1 = "abc";
  3. String s2 = new String("abc");
  4. //回答:s1在内存中有一个对象,s2在内存中有两个对象。
复制代码


s2在内存中有2个对象,这两个对象分别是什么?都存放在哪里?请指点下,多谢!

作者: yasyas001    时间: 2013-6-2 20:48
"abc"是在常量池中,new出来的是在堆内存中,所以有两个对象
作者: 小羽天空    时间: 2013-6-2 21:10
new String("abc")
字符串在内存中会有专门的常量池来记住存储。所以,毫无疑问。先把“abc”作为字符串存起来。这个应该理解吧?
但是因为new String("abc")这是个匿名对象。而匿名对象是要在对内存中开辟空间的。所以它会在对内存中开辟空间。然后再次把“abc”存储起来。
所以s2中俩个对象一次作为字符串进常量池,一次作为对象进堆内存。
作者: HM张勇    时间: 2013-6-2 21:18
小羽天空 发表于 2013-6-2 21:10
new String("abc")
字符串在内存中会有专门的常量池来记住存储。所以,毫无疑问。先把“abc”作为字符串存 ...

new String("abc")这是个匿名对象,这句话没反应过来,能解释下吗?
作者: 杨青    时间: 2013-6-2 21:32
String s=“java”,是指开辟一个对象空间,用来存储java,
String s=new String(”java“),一、开辟一个对象空间存储java,二、new一个String类型的对象存储java。

作者: 花开花落总相似    时间: 2013-6-2 21:56
String s1 = "abc";
这个在 data segment 中搞出一个 abc对象
String s2 = new String("abc");
这个 首先在 heap中new 出来一个String对象出来
然后 s2是在stack中指向这个new出来的对象  然后这个new出来的对象又会去寻找data segment中看他有没有abc这个字符串,
data segment会对内存有一个优化作用,也就是说 如果data segment中有了abc这个对象,他就不会再创建了,然后直接指向他就OK了
这也就是说  new出来的对象指向了 这个已经创建出来的abc 。   
作者: 王林涛    时间: 2013-6-2 22:46
String s1 = "abc";//这是赋值,这是把"abc"赋值给String类型的变量s1,
String s2 = new String("abc");//这里建立String的对象,并传入字符串"abc"
至于哥们儿你说存在于什么位置,这个我也有些郁闷了,请给全部的源码.因为像String s1 = "abc";我也不知道你是在给成员变量赋值,还是在给局部变量赋值...
哎,以后问问题请写详细,这样才好解决,希望能帮到你!


作者: 小羽天空    时间: 2013-6-3 12:52
HM张勇 发表于 2013-6-2 21:18
new String("abc")这是个匿名对象,这句话没反应过来,能解释下吗?

String  a ; a 是String对象,a 就是他的名字,;new  String();只是分配空间对象没有命名所以是“匿名”的。




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