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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 关山明月 中级黑马   /  2015-3-23 23:18  /  1459 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 关山明月 于 2015-3-24 16:58 编辑

刚看到视频,讲String类
  1.                 String s1="abc";//s1是一个类类型的变量,"abc"是一个对象。
  2.                 String s2=new String("abc");

  3.                 //s1和s2的区别
  4.                 //s1在内存中有一个对象
  5.                 //s2在内存中有两个对象
复制代码

问题:1、"abc"这个对象也是存放在堆内存中吗?
2、s2在内存中有两个对象,一个是new String(),另一个是"abc",如果都是在堆内存中的话,那s2对应的是哪个对象的地址值(即指向哪个对象)?

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1

查看全部评分

14 个回复

倒序浏览
坐等大神            
回复 使用道具 举报
s1  "abc"是储存在字符串常量池里面的地址
S2 是造了一个新对象,new String()储存在栈内存中,然后栈内存的地址又指向字符串常量池"abc"的地址.
so

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报
圣光忏悔 发表于 2015-3-24 13:26
s1  "abc"是储存在字符串常量池里面的地址
S2 是造了一个新对象,new String()储存在栈内存中,然后栈内存的 ...

new String()  是一个对象,不是应该储存在堆内存中吗?
回复 使用道具 举报
关山明月 发表于 2015-3-24 14:27
new String()  是一个对象,不是应该储存在堆内存中吗?

自己逗比把栈和堆弄混了....:L
回复 使用道具 举报
关山明月 发表于 2015-3-24 14:27
new String()  是一个对象,不是应该储存在堆内存中吗?

应该是s2储存在栈内存中,new String()存在堆内存中,s2指向new String()吧?
回复 使用道具 举报
圣光忏悔 发表于 2015-3-24 14:42
自己逗比把栈和堆弄混了....

呃,我还是没怎么明白,现在"abc"是在常量池中,new String()是在堆内存中,s2指向的是哪一个呢?new String() 和"abc"两者有什么关系吗?
回复 使用道具 举报
关山明月 发表于 2015-3-24 16:10
呃,我还是没怎么明白,现在"abc"是在常量池中,new String()是在堆内存中,s2指向的是哪一个呢?new Str ...

s2是指向new String()啊,只不过newString()中的内容与常量池中的"abc"一样而已。
回复 使用道具 举报
关山明月 发表于 2015-3-24 16:10
呃,我还是没怎么明白,现在"abc"是在常量池中,new String()是在堆内存中,s2指向的是哪一个呢?new Str ...

栈  用来运行main主方法的,有对象就造对象
但是造的对象只是一个空壳子,里面是地址值指向别处,比如
s1 栈造出来了,s1 = "abc";
这是把常量"abc"赋值给s1 常量储存在方法区的字符串常量池里面,所以s1在栈内存中  实际里面是一个指向字符串常量池"abc"的地址值
String s2 = new String("abc");
s2栈造出来了
然后new String  由于是new  所以马上在堆内存开辟一开空间储存,
然后里面的值是"abc",所以,堆内存里面也是一个地址值,指向常量池.
所以之后是s2---指向堆---堆在指向常量池
回复 使用道具 举报 1 0
这是老师讲课画图的截图.

55.png (159.02 KB, 下载次数: 18)

55.png
回复 使用道具 举报 1 0
圣光忏悔 发表于 2015-3-24 16:26
这是老师讲课画图的截图.

终于明白了,感谢感谢!:handshake
回复 使用道具 举报
剑雨飘扬 发表于 2015-3-24 16:21
s2是指向new String()啊,只不过newString()中的内容与常量池中的"abc"一样而已。 ...

嗯嗯,看楼下的图明白了,感谢感谢!:handshake
回复 使用道具 举报
圣光忏悔 发表于 2015-3-24 16:24
栈  用来运行main主方法的,有对象就造对象
但是造的对象只是一个空壳子,里面是地址值指向别处,比如
s1 栈 ...

:handshake  解释的很详细!
回复 使用道具 举报
解释的很好。。。赞!
回复 使用道具 举报
多看看堆栈定义就知道。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马