2014-09-24 132 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