请教一个关于垃圾回收的问题
class CardBoard {
Short story = 5;
CardBoard go(CardBoard cb) {
cb = null;
return cb;
}
public static void main(String[] args){
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
CardBoard c3 = c1.go(c2);
c1=null;
// do stuff
}
}
当运行到do stuff的时候 有多少对象满足垃圾回收的条件啊
请教一下 答案上说是两个 一个c1 一个story
我有些不解的是c3
请高手解答一下 c3是否满足垃圾回收条件啊 谢谢!
------解决方案--------------------c3没有指向任何对象,一直是null啊,哪来垃圾回收?
------解决方案--------------------c2 又没有为空,它一直和堆在的对象连接着呀。
c1.go(c2) 是把堆上的所创建的地址给传过去了。让它们指向同一个对象。但原c2 没有为空
------解决方案--------------------按我的理解:
例如引用c1原来指向一个对象 后来c1=null;了 它原来指向的那个对象就成垃圾了
但是c3从来就没有指向过任何的对象,又何来的垃圾回收呢...
------解决方案--------------------楼上的说的前半对后半不对。c3它在堆上连接了一个对象,只是这引连接一直没有被中断过而已。所以不满足垃圾回收的条件。
------解决方案--------------------c3只不过是个引用类型的局部变量,定义后被初始化为null,然后随main方法结束而消失.
垃圾回收器回收的是堆上的对象.
对于上面的代码
CardBoard c1 = new CardBoard();
CardBoard c2 = new CardBoard();
执行到这里的时候对象有4个,两个CardBoard对象,两个Short对象
c1指向的CarBoard对象
c2指向的CarBoard对象
c1.story指向的Short对象
c2.story指向的Short对象
CardBoard c3 = c1.go(c2);
执行到这里时,方法go得到的仅仅是c2这个引用类型变量的一个copy,不会影响到c2
所发生的事情是go方法中的cb指向了c2所指向的对象,然后cb又被赋了null
c1=null;
执行到这里,没有引用指向原c1所指向的对象了,所以该对象被回收,c1.story消失,原c1.story所指对象也被回收