封闭实例无效时包含类型行为

Dic*_*ici 2 java garbage-collection inner-classes

我运行了下面的片段,输出了Hey David.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我还测试了System.gc()在打印之前打电话a但我不确定它实际上是立即触发了一个完整的GC,所以它可能不相关.说实话,在运行代码之前,我不知道它应该发生什么,因为实际的行为对我来说似乎是逻辑的,就像NPE被抛出一样,因为它name被附加到一个无效的实例.

你能解释一下我们为什么观察它以及封闭类型的确切工作实例吗?

Sot*_*lis 6

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

  • 嗯,这实际上是一个愚蠢的问题,谢谢!延迟8分钟后我会接受这个答案. (2认同)