Java:垃圾收集的资格
如果以前有人问过,我道歉 我有以下情况:Java:垃圾收集的资格,java,Java,如果以前有人问过,我道歉 我有以下情况: public class Distress{ private static Distress distressIns; private MyFirstClass aClass; private MySecondClass bClass; private Distress(){ aClass = new MyFirstClass(); bClass = new MySecondClass();
public class Distress{
private static Distress distressIns;
private MyFirstClass aClass;
private MySecondClass bClass;
private Distress(){
aClass = new MyFirstClass();
bClass = new MySecondClass();
}
///update: this is a singleton class
public static getIns(){
if (distressIns == null){
distressIns = new Distress();
}
return distressIns;
}
public static destroyIns(){
distressIns = null;
}
}
在上面的场景中,如果有人调用
destroyIns()
,那么aClass
和bClass
也会变成null
?否。首先,有人可能会保留对distressIns
的引用(你的getIns()
方法毕竟是公共的,所以可能还有另一个引用)
其次,变量不会因为被垃圾收集而“变为null”。对象可能被垃圾收集,也可能不被垃圾收集,这取决于是否存在另一个引用。为什么不测试它<代码>遇险d=遇险.getIns();危难,毁灭();System.out.println(d.getAClass())代码>相关:这里很好地解释了这个问题:
新的困境代码>->新遇险()代码>我没有足够的rep来编辑我自己。@Byakuya如果有人持有对distressIns的引用,那么它不能为空,否则它不会持有对distressIns的引用。将distressIns设置为null将为distressIns变量指定null。该对象仍然存在,并且仍然可以被其他变量引用。当无法再访问它时,它将从内存中消失,GC将收集它。@Sunny:不。唯一变为null的是distressIns变量。引用同一对象的其他变量不受影响。不能将另一个对象对某个对象的引用设为空。仅仅因为对对象的本地引用为null,其他引用保持不变。因此,destroyIns
方法将使该对象自身的引用为空,但它不能使调用该对象的getIns
方法的任何其他对象所持有的引用为空。@Byakuya因此,即使有一个实例四处浮动,如果我将distressIns设为空,持有这一单一遇险案例的其他人仍然存在,因此不符合GC的资格。如果我在这里有错,请帮助我理解是的,这些其他参考是痛苦值的副本
。这些副本不会消失,因为您将distressIns
设置为空。