我运行了以下代码段,其中输出了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);
}
}
我还测试了在打印System.gc()
之前调用a
,但我不确定它是否实际上触发了一个完整的GC,因此它可能不相关。说实话,在运行代码之前,我不知道它应该发生什么,因为实际的行为对我来说似乎是逻辑的,就好像抛出了一个NPE,因为name
被附加到一个实例上。无效。
你能解释一下为什么我们观察它以及封闭类型的确切工作实例吗?
答案 0 :(得分:6)
实例永远不会无效。这不是Java中存在的概念。无效的是变量,即引用。但是,A
实例仍然具有对其封闭实例的有效引用,因此可以使用它。