Java 封闭实例为空时的封闭类型行为

Java 封闭实例为空时的封闭类型行为,java,garbage-collection,inner-classes,Java,Garbage Collection,Inner Classes,我运行了以下代码段,输出了heydavid public class Test { public String name; public Test(String name) { this.name = name; } public class A { public String toString() { return "Hey " + name; } } public s

我运行了以下代码段,输出了
heydavid

public class Test {
    public String name;

    public Test(String name) {
        this.name = name;
    }

    public class A {
        public String toString() {
            return "Hey " + name;
        }
    }

    public static void main(String[] args) {
        Test test = new Test("David");
        A a = test.new A();
        test = null;
        System.out.println(a);
    }
}
在打印
a
之前,我还测试了调用
System.gc()
,但我不确定它是否会立即触发一个完整的gc,因此可能不相关。老实说,在运行代码之前,我不知道应该发生什么,因为在我看来,实际行为就像抛出了一个NPE一样合乎逻辑,因为
name
附加到了一个无效的实例


您能解释一下为什么我们会观察到这一点,以及封闭类型的实例是如何工作的吗?

实例永远不会为空。这不是Java中存在的概念。无效的是变量,即引用。但是,
A
实例仍然有一个对其封闭实例的有效引用,因此可以使用它。

如果Java GC与.NET GC类似:将其设置为
null
不会对GC造成影响,因为对象生命周期表。而
System.gc()
不保证执行gc。您在这里所做的只是将变量指向
null
,但这不会“删除”对象本身,因为您没有触摸
a
。我想我明白了:我刚刚失去了对
test
的引用,但对象仍然存在,并且不被视为垃圾回收(如果这是正确的术语)因为我在一个封闭的实例上仍然有一个有效的引用。是吗?@Dici,没错。你可以从
a
中找到它的引用。事实上,这是一个愚蠢的问题,无论如何,谢谢!延迟8分钟后我会接受这个答案。