我运行了以下代码片段,它输出了 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);
}
}
我还测试了在打印 a
之前调用 System.gc()
但我不确定它是否会立即触发完整的 GC,因此它可能不相关。老实说,在运行代码之前我不知道它应该发生什么,因为实际的行为对我来说就像抛出 NPE 一样合乎逻辑,因为 name
附加到一个无效的实例。
您能解释一下为什么我们观察到这一点以及封闭类型的实例究竟是如何工作的吗?
最佳答案
实例永远不会无效。这不是 Java 中存在的概念。被取消的是变量,引用。但是,A
实例仍然具有对其封闭实例的有效引用,因此可以使用它。
关于java - 封闭实例无效时的封闭类型行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26021770/