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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© §傻、才乖 中级黑马   /  2013-12-10 01:15  /  1299 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s=new String("abc");
这个在内存中创建的是两个对象,但s指向的是哪个对象,s的值是哪个对象的值,还是这两个对象的值有什么联系?
求解

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

5 个回复

倒序浏览
如果 s指向的是new String 那么 “abc”的对象值又存到哪了
回复 使用道具 举报
本帖最后由 高亮亮 于 2013-12-10 07:50 编辑

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

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 翼展哈哈 于 2013-12-10 09:05 编辑

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

评分

参与人数 1技术分 +1 收起 理由
贺奕凯 + 1

查看全部评分

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

String s = new String("abc");在栈内存中开辟了一个变量空间s,s指向了new String的内存首地址值,而new String里面存放的则是abc的内存首地址值。
即:s是引用型变量,s指向的是new出的对象的首地址值,而new出的对象里面存储的则是对象abc的内存首地址值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马