当Tester类的main方法到达终点时,有多少对象符合垃圾回收的条件?我的印象是答案是两个,特别是a1,b1。但是我发现某处是核心答案,只有a1对象才有资格。我认为既然我们没有在a2中将b1作为成员变量赋值,那么b1在主要结束之前被赋值为null,它应该由垃圾收集器收集。什么是真的?
class B {
}
class A {
static B b1;
B b2;
}
public class Tester {
public static void main(String[] args) {
B b1 = new B();
B b2 = new B();
A a1 = new A();
A a2 = new A();
a1.b1 = b1;
a1.b2 = b1;
a2.b2 = b2;
a1 = null;
b1 = null;
b2 = null;
}
}
答案 0 :(得分:2)
最初分配给方法范围变量b1
的对象不符合收集条件,因为Class A
中对它的引用是静态。它不会与a1的特定实例一起到期。虽然a1.b1
和A.b1
是相同的引用,但它是一种不稳定的java语法,但它就是它的本质。无论A的任何实例(如a1)发生什么情况,该引用都将保持有效,直到A类未加载/ JVM存在为止。
代码将方法中的指针b1
指定为null,但不会将A.b1
指定为null。
答案 1 :(得分:0)
你唯一没有废除的参考是a2
。您的答案将是a2
所以你有a2
,而b2
引用了a2.b2
a1
和(在main
方法的范围内)不能,因此被垃圾收集。
actaually,affe是对的,b1
是静态的,因此是可以访问的。
答案 2 :(得分:0)
a2
- 因为它没有被取消b2
(分配给b2
的原始对象) - 因为它由a2持有b1
(分配给b1
的原始对象) - 因为它保存在static
变量中