关于java垃圾回收器的一道题
1. class Bar { }
1. class Test {
2. Bar doBar() {
3. Bar b = new Bar();
4. return b;
5. }
6. public static void main (String args[]) {
7. Test t = new Test();
8. Bar newBar = t.doBar();
9. System.out.println(“newBar”);
10. newBar = new Bar();
11. System.out.println(“finishing”);
12. }
13. }
At what point is the Bar object, created on line 3, eligible for garbage collection?
A. After line 8.
B. After line 10.
C. After line 4, when doBar() completes.
D. After line 11, when main() completes.
Answer: C
有些不解,请高手指教!
参考答案:且不管答案最终如何,我认为这道题考察了2个知识点,1.垃圾回收器回收对象的原则,2.return返回的是引用还是新的对象。
关于第1点,垃圾回收器回收对象的原则是:如果一个对象没有在任何地方被引用,即没有任何一个引用指向这个对象,那么这个单元就是可以被回收的。
关于第2点,如果return返回时是新开辟一个内存空间,并且将原对象复制一份到这个新开辟的空间,然后返回指向这个新开辟空间的引用,那么行3创建的对象将在运行到行4时变成一个没有被任何地方引用的垃圾单元,可以被回收。如果return仅仅返回的是原对象的一个引用,那么行3创建的对象在行10的代码运行之前一直被引用,直到行10将变量newBar重定向到另一个新创建的Bar对象后,才不被任何一个地方引用,可以被回收。
在我印象中,对于非基本数据类型,return返回的仅仅是原对象的引用,不新建对象,因此我个人认为答案C是错误的,dakiler的回答是正确的,答案应该是B。
如果有不同见解的高手,期待你更精彩的解释。