2014-09-24 136 views
2

我运行了以下代码段,输出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,所以可能是不相关的。说实话,在运行代码之前,我不知道应该发生什么,因为对于我来说,实际行为对于我来说似乎是合理的,因为name被附加到一个无效的实例。

你能解释一下为什么我们观察到这种封闭类型的工作实例吗?

+1

如果Java GC与.NET GC类似:将它设置为null将不会因为对象生存期表而对GC产生影响。 'System.gc()'不保证执行GC。你在这里所做的只是将变量指向'null',但由于你不碰'a',所以它不会“移除”对象本身。 – 2014-09-24 16:18:58

回答

6

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

+0

我想我明白了:我只是失去了对'test'的引用,但对象仍然存在,并且不被视为垃圾收集(如果这是正确的术语),因为我仍然有封闭实例的有效引用。是吗? – Dici 2014-09-24 16:20:25

+0

@Dici这是正确的。你从'a'有一个可达的参考。 – 2014-09-24 16:21:03

+2

嗯,这实际上是一个愚蠢的问题,无论如何,谢谢!延迟8分钟后我会接受这个答案。 – Dici 2014-09-24 16:21:42