日期:2014-05-20  浏览次数:20611 次

请教一个关于垃圾回收的问题
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所指对象也被回收