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
设置为空。