在下面的代码中,我不明白为什么使用引用b2
创建的对象不是null
??。
我已将b2 = null
传递给go()
对象的b1
方法(在制作b1 = null
之前),因此我制作了class Demo {
Short story = 200;
Demo go(Demo cb) {
cb = null;
return cb;
}
public static void main(String[] args) {
demo b1 = new demo();
demo b2 = new demo();
demo b3 = b1.go(b2);
b1 = null;
// b1 has been collected by gc hence is null
System.out.println(b1.hashCode());
// b3 is also null
System.out.println(b3.hashCode());
// but how come b2 is not null?
System.out.println(b2.hashCode());
}
}
。
element.style.width = "32mm"; for example.
所以请有人解释一下,为什么b2不是垃圾收集,即使它是空的?
答案 0 :(得分:4)
demo b3 = b1.go(b2);
Demo go(Demo cb){
cb = null;
return cb;
}
使用上面的代码,b2
和cb
的第一个将指向同一个对象。然后当您执行cb = null;
然后执行cb
时,参考将丢失。但b2
仍然指向原始对象。
这意味着至少有一个对象(b2
)主动持有对分配的内存/对象的引用。它没有资格进行垃圾收集。
将任何对象设置为null
引用并不意味着它被垃圾收集器收集。它只是意味着,现在没有对已分配对象的活动引用,因此它有资格进行垃圾回收。
答案 1 :(得分:4)
首先需要知道垃圾收集(GC)与将某些内容设置为null不同。
我在这里做个比喻。变量(b1
,b2
,b3
等)就像孩子一样。对象(new Demo()
)就像气球。当你写:
demo b1 = new demo();
您让孩子b1
抓住一个新气球。当您将b1
设置为null时,您可以让孩子放开他的气球。气球飞走了,但它仍然存在于天空的某个地方。另一方面,GC就像一个能够捕捉这些飞行气球的超高科技机器。孩子放开气球后,GC会在一段时间后注意到它(这个“时间”可能会有所不同)并去收集它并摧毁它。
现在您已经了解了nullity和GC之间的区别,我们可以继续解决您的真正问题。在方法
Demo go(Demo cb){
cb = null;
return cb;
}
您正在将cb设置为null并将其返回。返回值为null。但是,cb
不是您之前传递的孩子(b2
)。您有一个拿着气球的孩子(b2
),当您“将孩子作为参数传递”时,您没有经过孩子,您正在邀请另一个孩子抓住同一个气球。在该方法中,cb
是另一个孩子。因此,当将cb
设置为null时,您让“另一个孩子”放开气球,但原始孩子b2
仍然持有它。
请参阅? b2仍然拿着气球!他不是空的!
答案 2 :(得分:2)
因为cb指向b2所做的同一个对象,但cb与b2不是同一个变量。将cb设置为null不会对b2或b2指向的对象执行任何操作。
答案 3 :(得分:1)
这不是垃圾收集的工作原理。垃圾收集器将找到不再具有任何引用的对象,并收集它们。它将不收集仍然引用它们的对象,并且它不会将任何变量设置为null。