我正在从一本java认证书中做一些练习。在有关垃圾收集的问题中,它们提供以下代码:
class Test {
private Demo d;
void start() {
d = new Demo();
this.takeDemo(d);
}
void takeDemo(Demo demo) {
demo = null;
demo = new Demo();
}
}
问题是
在第4行创建的Demo对象何时符合垃圾条件 集合?
我会说它可以在指令demo = null之后收集;因为不再引用它,但他们给出的答案是:
当运行此代码的实例符合垃圾资格时 集合
我错过了什么?
答案 0 :(得分:5)
Java is "pass-by-value",因此此声明demo = null;
仅影响demo
中takeDemo
的本地副本。它不会将d
设置为null
,只要封闭实例可以访问,就可以访问{。}}。
答案 1 :(得分:1)
您正确地注意到demo
设置为null
。但是d
不是。它仍然保留对同一对象的引用。因此答案。
答案 2 :(得分:1)
因为demo = null
只是更改方法参数demo
的值,这是方法的本地值,并且不会影响字段d
的值。请记住,在Java中,所有方法参数都按值传递。
答案 3 :(得分:0)
在方法d
完成之前,对局部变量start()
的引用是“活动的”。在此之前,垃圾收集不应该释放它。
答案 4 :(得分:0)
第4行的演示只能与Test实例一起收集。或者,如果再次调用start方法(将收集旧的Demo并重新创建)
takeDemo方法对第一个Demo没有影响。但它创造了第二个演示。在takeDemo方法完成后,可以立即收集第二个Demo。
答案 5 :(得分:0)
当你调用this.takeDemo(d);参考d的值被复制到参数demo,因此d和demo都引用了第4行中创建的对象。现在在方法内部,当您将变量demo设置为null时,d仍然保持引用,因此对象将是一旦“实例测试”类被垃圾收集,就有资格进行垃圾收集。