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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© z-翔 中级黑马   /  2014-6-19 17:21  /  1804 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 z-翔 于 2014-6-20 10:04 编辑

String s=new String("abc")在内存中产生两个对象?都是哪两个?脑子有点转不过弯..

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

12 个回复

倒序浏览
和你探讨: 在栈内存中生成变量s 引用堆内存对象地址,  在堆内存中划出内存空间存储 abc, 这样在栈和堆中就都有s了,算两个?
回复 使用道具 举报
本帖最后由 小夜 于 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 19:31

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报 1 0
本帖最后由 黎志勇 于 2014-6-19 17:41 编辑

String s=new String("abc");
先在方法区的常量池中创建字符串常量"abc"(就是构造函数里面的参数"abc"),然后new String("abc")中利用该字符串常量作为参数在堆内存中创建新的字符串对象。
所以一共有两个对象,方法区的常量池里面有一个,堆内存中有一个。

点评

学习!  发表于 2014-6-19 17:45
回复 使用道具 举报
陈鹏83 发表于 2014-6-19 17:25
和你探讨: 在栈内存中生成变量s 引用堆内存对象地址,  在堆内存中划出内存空间存储 abc, 这样在栈和堆中 ...

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

受教了,谢谢
回复 使用道具 举报
z-翔 中级黑马 2014-6-19 17:44:26
7#
小夜 发表于 2014-6-19 17:30
在 堆内存中产生一个对象  存储 abc,
在 栈内存中产生一个变量存储 这个对象的引用(这个对象的 地址值)。 ...

懂了,谢谢。
回复 使用道具 举报
""就算一个对象,还有个new,所以两个对象,看看api
回复 使用道具 举报
黎志勇 发表于 2014-6-19 17:34
String s=new String("abc");
先在方法区的常量池中创建字符串常量"abc"(就是构造函数里面的参数"abc"), ...

了解了!
回复 使用道具 举报
alive 来自手机 中级黑马 2014-6-20 02:03:02
10#
字符串对象在常量池中,s是对象的引用,不是对象,s指向的才是对象
回复 使用道具 举报
new是在堆内存中,"abc"在字符串池中
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马