黑马程序员技术交流社区

标题: String str = new String ("abc");在内存中为什么有两个对象 [打印本页]

作者: znouy_92    时间: 2014-12-26 14:30
标题: String str = new String ("abc");在内存中为什么有两个对象
String str = new String ("abc");在内存中为什么有两个对象?谁能用图简单的描述下吗。

作者: 小僧玄奘    时间: 2014-12-26 16:41
1个boject
1个str
作者: 杨佳名    时间: 2014-12-26 22:06
new出的一个对象在堆内存中,然后这个对象指向了常量池中的"abc",即str是间接指向了"abc"
作者: 滴水石穿    时间: 2014-12-26 22:14
其实,括号里面的字符串就是一个对象,   new   又是一个对象,所以就形成了两个对象,不知道您明白没有
作者: 西风烈123    时间: 2014-12-26 22:41
String S1="abc"是一个对象      
String S2=new String()又是一个对像
所以 String S2=new String("abc")是两个对象
楼主只是感觉创建一个对象必须是new  但字符串是一个特殊的对象
作者: 西风烈123    时间: 2014-12-26 22:42
而且一旦初始化就不可以改变
作者: 黑马-李权88    时间: 2014-12-26 22:49
这个我可以回答,str 是栈内存里面的变量来的  是引用变量
作者: 探寻者    时间: 2014-12-26 22:57
老师视频里面好像说过了,括号里面的字符串常量和new出来的一个新的对象,所以是两个。
作者: 李票    时间: 2014-12-26 23:03
new String("abc")表明建立一个对象。 String("abc")是一个含有参数的构造方法,new个构造方法就相当于new个对象并且把abc这个属性给了这个对象str,而所有的类都继承与object,new个子类对象,子类对象可以调用父类中的非私有方法和属性,间接的建立了父类对象,因为方法只能被对象所调用,除非是静态函数和属性也可以被类名所调用。
作者: 7788665544    时间: 2014-12-26 23:54
new出来的在堆内存中,str的那个“abc”在常量池。。
作者: 撬佳人丶    时间: 2014-12-27 00:22
因为“abc”是String类型,而String类型是一个特殊的引用类型,他的字符串都存放在常量池中,而通过new关键字后,系统会在堆中分配新的空间给这个对象,新开辟的对内存空间指向常量池中的对象他们的值相同,但物理地址不同。
作者: 马北剑西    时间: 2014-12-27 00:34
表示也有类似疑问
作者: znouy_92    时间: 2014-12-27 17:08
杨佳名 发表于 2014-12-26 22:06
new出的一个对象在堆内存中,然后这个对象指向了常量池中的"abc",即str是间接指向了"abc" ...

貌似点醒了我,谢谢
作者: znouy_92    时间: 2014-12-27 17:09
滴水石穿 发表于 2014-12-26 22:14
其实,括号里面的字符串就是一个对象,   new   又是一个对象,所以就形成了两个对象,不知道您明白没有 ...

你回答得很好,谢谢咯
作者: znouy_92    时间: 2014-12-27 17:11
马北剑西 发表于 2014-12-27 00:34
表示也有类似疑问

看上面学友的回答,感觉说的蛮好的
作者: 滴水石穿    时间: 2014-12-27 22:11
znouy_92 发表于 2014-12-27 17:09
你回答得很好,谢谢咯

不用客气
作者: duluhua    时间: 2014-12-27 22:40
一个是栈中的String str ,另外一个是在堆内存中开辟的new String();,str指向new String();地址,而new String();指向字符串常量池,如果常量池中有“abc”就直接指向,如果没有就创建个"abc"再指向它
作者: Jason996    时间: 2014-12-27 23:03


String是个特殊引用类型,会产生两个对象。第一个:new 的对象是放在堆内存里的。第二个:abc是放在字符串常量池里的。

作者: 还在路上    时间: 2014-12-27 23:11
前面的都讲得很清楚了:
因为对象在内存中的位置不一样
new出来的在堆中
还有一个字符串常量池
作者: 流星划过的黎明    时间: 2014-12-27 23:13
string类型的底层是一个不可变的字符串组,所以"abc"本身就是一个对象存在于常量池中,str又再堆内存创建了一个指向性的对象,所以就是两个对象了
作者: 1094768121    时间: 2014-12-28 19:04
在这里我可以给你一个详细的解释,编程,每个人对每个问题的理解都是不一样的,这是我的理解,这个不需要图就可以解释,“abc”就是一个对象它存在内存里面,我们可以这样定义一个字符串String s=“abc”这里就定义了一个对象,然后String str = new String ("abc")它又new了一个对象,所以内存中存在俩个对象。
作者: 红楼    时间: 2014-12-28 19:14
原来是这样
作者: 时间都去哪了    时间: 2014-12-31 19:04
常量池一份,堆内存一份,详情请看图解

无标题.png (80.94 KB, 下载次数: 5)

无标题.png





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