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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

String str = new String ("abc");在内存中为什么有两个对象?谁能用图简单的描述下吗。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

22 个回复

倒序浏览
1个boject
1个str
回复 使用道具 举报
new出的一个对象在堆内存中,然后这个对象指向了常量池中的"abc",即str是间接指向了"abc"
回复 使用道具 举报
其实,括号里面的字符串就是一个对象,   new   又是一个对象,所以就形成了两个对象,不知道您明白没有
回复 使用道具 举报
String S1="abc"是一个对象      
String S2=new String()又是一个对像
所以 String S2=new String("abc")是两个对象
楼主只是感觉创建一个对象必须是new  但字符串是一个特殊的对象
回复 使用道具 举报
而且一旦初始化就不可以改变
回复 使用道具 举报
这个我可以回答,str 是栈内存里面的变量来的  是引用变量
回复 使用道具 举报
老师视频里面好像说过了,括号里面的字符串常量和new出来的一个新的对象,所以是两个。
回复 使用道具 举报
李票 中级黑马 2014-12-26 23:03:31
9#
new String("abc")表明建立一个对象。 String("abc")是一个含有参数的构造方法,new个构造方法就相当于new个对象并且把abc这个属性给了这个对象str,而所有的类都继承与object,new个子类对象,子类对象可以调用父类中的非私有方法和属性,间接的建立了父类对象,因为方法只能被对象所调用,除非是静态函数和属性也可以被类名所调用。
回复 使用道具 举报
new出来的在堆内存中,str的那个“abc”在常量池。。
回复 使用道具 举报
因为“abc”是String类型,而String类型是一个特殊的引用类型,他的字符串都存放在常量池中,而通过new关键字后,系统会在堆中分配新的空间给这个对象,新开辟的对内存空间指向常量池中的对象他们的值相同,但物理地址不同。
回复 使用道具 举报
表示也有类似疑问
回复 使用道具 举报
杨佳名 发表于 2014-12-26 22:06
new出的一个对象在堆内存中,然后这个对象指向了常量池中的"abc",即str是间接指向了"abc" ...

貌似点醒了我,谢谢
回复 使用道具 举报
滴水石穿 发表于 2014-12-26 22:14
其实,括号里面的字符串就是一个对象,   new   又是一个对象,所以就形成了两个对象,不知道您明白没有 ...

你回答得很好,谢谢咯
回复 使用道具 举报

看上面学友的回答,感觉说的蛮好的
回复 使用道具 举报
znouy_92 发表于 2014-12-27 17:09
你回答得很好,谢谢咯

不用客气
回复 使用道具 举报
一个是栈中的String str ,另外一个是在堆内存中开辟的new String();,str指向new String();地址,而new String();指向字符串常量池,如果常量池中有“abc”就直接指向,如果没有就创建个"abc"再指向它
回复 使用道具 举报


String是个特殊引用类型,会产生两个对象。第一个:new 的对象是放在堆内存里的。第二个:abc是放在字符串常量池里的。
回复 使用道具 举报
前面的都讲得很清楚了:
因为对象在内存中的位置不一样
new出来的在堆中
还有一个字符串常量池
回复 使用道具 举报
string类型的底层是一个不可变的字符串组,所以"abc"本身就是一个对象存在于常量池中,str又再堆内存创建了一个指向性的对象,所以就是两个对象了
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马