黑马程序员技术交流社区

标题: new String 的对象问题 [打印本页]

作者: §傻、才乖    时间: 2013-12-10 01:15
标题: new String 的对象问题
String s=new String("abc");
这个在内存中创建的是两个对象,但s指向的是哪个对象,s的值是哪个对象的值,还是这两个对象的值有什么联系?
求解

作者: §傻、才乖    时间: 2013-12-10 01:19
如果 s指向的是new String 那么 “abc”的对象值又存到哪了
作者: 高亮亮    时间: 2013-12-10 07:48
本帖最后由 高亮亮 于 2013-12-10 07:50 编辑

首先,只要是new出来的都是在对内存中,开辟了空间,将空间的地址值赋给new出来的那个对象。这样,String s=new String("abc");s就是一个对象,s指向的是那个存储了下面那个存放"abc"String数组地址值的那个对象。
又是因为这个String型的s是一个数组,而数组又是个应用类型,可以理解为指向另一块地址,那个地址里面相当于存放了字符"abc"。也可以看作一个对象吧。
这样,就是两个对象了。


作者: 翼展哈哈    时间: 2013-12-10 08:59
本帖最后由 翼展哈哈 于 2013-12-10 09:05 编辑

楼主您好,我说一下我个人的理解吧!
“等号左边String s”,声明了一个String类型的引用变量;等号右边的“new String("abc")”,查阅jdk文档,显示:
        String(String original)
          初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
   由此可知,您说的两个对象,应该分别是指参数字符串常量“abc”和在堆中新创建的内容也为"abc"的对象实体(即参数字符串常量的副本)。引用变量s指向的当然是后者,即新创建的对象实体,而非字符串常量"abc".因为如果指向字符串常量的话,那就直接把字符串常量的地址值赋给引用变量s就可以了,就没有必要再创建一个具有相同内容的对象实体啦!
希望您的理解,有什么说的不对的,欢迎批评指正!

作者: 史超    时间: 2013-12-10 09:01
String s = new String("abc");当你new的同时,已经在栈内存中生成了一个对象s,而new出来的东西就是“abc”,new出来之后“abc“会有一个地址值(如:0x0011),它会把地址值赋给S。所以s指向的对象就是带有地址值的”abc“;S的值就是abc;他们的联系实际就是用地址值串联起来的。
作者: 雪飘舞    时间: 2013-12-10 09:10
本帖最后由 雪飘舞 于 2013-12-10 09:12 编辑

String s = new String("abc");在栈内存中开辟了一个变量空间s,s指向了new String的内存首地址值,而new String里面存放的则是abc的内存首地址值。
即:s是引用型变量,s指向的是new出的对象的首地址值,而new出的对象里面存储的则是对象abc的内存首地址值





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