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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周世阳 中级黑马   /  2012-8-9 11:10  /  1871 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周世阳 于 2012-8-9 12:53 编辑

在Java里面,引用是指向对象的,引用本身是对象么?
因为这里设计到一个题目
String s = new String(“abc”)会新建几个对象?

假设栈的字符串池里没有“abc”,则会新建一个“abc”字符串,并在堆上new一个String对象,标准答案是2个,但有2种解答
1).栈上一个匿名对象,即“abc”,堆上一个new对象。
2).引用是一个对象,new是一个对象,多所以是两个。
但实际上如果栈上和引用都算了对象,那么答案应该有3个:少数人支持的答案。
我认为栈上的不能算对象,栈上的字符串池是java针对字符串的一种优化,并不是真的对象(除非到了jdk9)。
现在的问题是引用呢?引用算不算对象?有没有人有研究过知道的,解答下

8 个回复

倒序浏览
现在的问题是引用呢?引用算不算对象?有没有人有研究过知道的,解答下

String s=new String("abc")
这条语句会创建两个对象
第一个对象是:存在于堆内存中的字符串类型对象"abc"
第二个对象是:指向该字符串类型对象"abc"的引用变量 s


上面那条语句可以拆分为两步:
String s;
s=new String("abc")


毕老师亲口说的。

另外:上面那条语句不会在常量池中生成"abc"
万物皆对象

回复 使用道具 举报
本帖最后由 尤洋 于 2012-8-9 11:49 编辑

String s = new String(“abc”)
你没必要想那么多,引用s 所对应的是地址,
无论是“abc”对象  还是new出来的对象都不可能直接放进s里
而只可能是 s这个变量 指向于对象的地址值。

引用是一个变量,不是对象,对应的是地址值。记住这一点就OK,想多了没用,网上关于String的争论很多,关于字符串池 在哪个内存的争论也很多,你纠结在这个方面的话
就 陷进坑里爬不出来了。
回复 使用道具 举报
会生成两个对象
在栈中存在一个 String类型的s
因为凡是用new出来的对象都是一个实体  实体都存在与堆内存中
那么在堆内存中会有个String类型的对象 并且分配一个内存地址空间
回复 使用道具 举报
对象和引用本身就是两个不同的概念,你说怎么能等同了。有点牛角尖了吧
回复 使用道具 举报
String s = new String(“abc”)
首先会先在堆中检查有没有"abc"这个对戏那个,如果堆中已经存在了,则不需要创建新的对象了,直接引用。
new就是只想这个字符串的"abc"的引用变量。
所以要看对中在创建以前有没有"abc",如果没有就是2个对象。如果以前就存在了,则就不需要在创建新的对象了,所以就是1个对象。
回复 使用道具 举报
尤洋 发表于 2012-8-9 11:47
String s = new String(“abc”)
你没必要想那么多,引用s 所对应的是地址,
无论是“abc”对象  还是new ...

thanks。。。。
回复 使用道具 举报
亲, 常量池是 方法区不是在 栈中哦,"abc" 是在堆中哦, s只是个引用,一个变量名,不算是 对象。 大部分人也支持这个观点,
老张也说了从严格的意义上来收,它算是对象,但一般我们都不会这么认为。要看面试官眼色,随机应变的,
楼主了解了就OK了,不要纠结这些有点争议的问题了
回复 使用道具 举报
瞿乐 发表于 2012-8-9 12:29
亲, 常量池是 方法区不是在 栈中哦,"abc" 是在堆中哦, s只是个引用,一个变量名,不算是 对象。 大部分 ...

thanks。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马