假设:
1. public class GC {
2. private Object o;
3. private void doSomethingElse(Object obj) { o = obj; }
4. public void doSomething() {
5. Object o = new Object();
6. doSomethingElse(o);
7. o = new Object();
8. doSomethingElse(null);
9. o = null;
10. }
11. }
当调用doSomething()
方法时,在第5行创建的Object
可用于垃圾收集之后是哪一行?
正确答案是第8行。
为什么?我认为它应该是第7行,因为new会发起新的Object
,然后分配到o
,这会导致第5行中创建的Object
丢失其引用(然后才有资格获得GC )。我错了吗?
答案 0 :(得分:4)
正确的答案是第8行。为什么会这样?
您将o
本地doSomething()
与o
类别混淆,令您感到困惑。尽管第7行将o
的doSomething()版本设置为其他引用,但您仍然拥有通过o
方法设置的类级doSomethingElse()
。您必须将该引用置空以使其符合GC条件,并且只能通过第8行的方法调用进行。