当Cat two=one时,原先 two开辟的堆空间是不是就被释放掉了

当Cat two=one时,原先 two开辟的堆空间是不是就被释放掉了

为什么不是TWO指向One的地址的同时也指向two的地址?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
irista23 2018-03-12 11:30:55

首先,对象的引用和基本类型的变量都是存放在栈中的,而由new创建出来的对象是存放在堆中的。Cat two=one是在堆中创建了一个对象one后,在栈中定义了一个变量two,然后让栈中的two变量的取值等于one对象在堆内存中的首地址,以后就可以在程序中使用栈中的引用变量two来访问堆中的对象了。

  • 提问者 liqihang #1
    这个我知道,我的意思是说在Cat one-new Cat(),Cat two=new Cat()之后,再定义Cat two=one,是不是会将two之前开辟的堆空间给释放掉而重新指向one?
    2018-03-13 09:10:39
  • irista23 回复 提问者 liqihang #2
    首先在同一个作用域里分别执行Cat one=new Cat(),Cat two=new Cat()以后在定义Cat two=one,会因为重复定义出现编译错误。视频中老师是Cat one=new Cat()后又执行的Cat two=one,所以不会出现你说的没有引用的空间,两个引用指向同一个对象。如果你是想先Cat one=new Cat()后又执行的Cat two=new Cat(),最后one=two;那么这样就会出现你说的情况,two指向的地址会重新存放到one中,这样one就不会再指向一开始new创建的堆区域了,但Java的GC垃圾回收机制会回收掉无引用的堆里的这部分开辟的空间。
    2018-03-13 10:17:07
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师