黑马程序员技术交流社区

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

作者: z-翔    时间: 2014-6-19 17:21
标题: String类new对象的问题
本帖最后由 z-翔 于 2014-6-20 10:04 编辑

String s=new String("abc")在内存中产生两个对象?都是哪两个?脑子有点转不过弯..
作者: 陈鹏83    时间: 2014-6-19 17:25
和你探讨: 在栈内存中生成变量s 引用堆内存对象地址,  在堆内存中划出内存空间存储 abc, 这样在栈和堆中就都有s了,算两个?
作者: 小夜    时间: 2014-6-19 17:30
本帖最后由 小夜 于 2014-6-19 17:36 编辑

在 堆内存中产生一个对象  存储 abc,
在 栈内存中产生一个变量存储 这个对象的引用(这个对象的 地址值)。通过这个地址值 找到 这个对象。。

http://www.cnblogs.com/ydpvictor/archive/2012/09/09/2677260.html
引用 这个里面的 一段话,,其他的我 认为 就先别理解了。
我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("abc")了。
目前只要懂,java通过new关键字,来创建出 对象,放在堆内存中 就ok了。


作者: 黎志勇    时间: 2014-6-19 17:34
本帖最后由 黎志勇 于 2014-6-19 17:41 编辑

String s=new String("abc");
先在方法区的常量池中创建字符串常量"abc"(就是构造函数里面的参数"abc"),然后new String("abc")中利用该字符串常量作为参数在堆内存中创建新的字符串对象。
所以一共有两个对象,方法区的常量池里面有一个,堆内存中有一个。
作者: z-翔    时间: 2014-6-19 17:41
陈鹏83 发表于 2014-6-19 17:25
和你探讨: 在栈内存中生成变量s 引用堆内存对象地址,  在堆内存中划出内存空间存储 abc, 这样在栈和堆中 ...

对象不是都存放在堆内存中么?
话说,生成变量s,引用堆内存对象地址,这也是一个对象么?
那String s = "abc"中s也引用对象地址吧..
作者: z-翔    时间: 2014-6-19 17:43
黎志勇 发表于 2014-6-19 17:34
String s=new String("abc");
先在方法区的常量池中创建字符串常量"abc"(就是构造函数里面的参数"abc"), ...

受教了,谢谢
作者: z-翔    时间: 2014-6-19 17:44
小夜 发表于 2014-6-19 17:30
在 堆内存中产生一个对象  存储 abc,
在 栈内存中产生一个变量存储 这个对象的引用(这个对象的 地址值)。 ...

懂了,谢谢。
作者: MasMajesty    时间: 2014-6-19 21:18
""就算一个对象,还有个new,所以两个对象,看看api
作者: 215041631    时间: 2014-6-19 21:59
黎志勇 发表于 2014-6-19 17:34
String s=new String("abc");
先在方法区的常量池中创建字符串常量"abc"(就是构造函数里面的参数"abc"), ...

了解了!
作者: alive    时间: 2014-6-20 02:03
字符串对象在常量池中,s是对象的引用,不是对象,s指向的才是对象
作者: keep_moving    时间: 2014-6-20 09:41
new是在堆内存中,"abc"在字符串池中




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