2011-05-30 55 views
8

我已經通讀了內部類教程,並不理解一件事。它被說,內部類持有隱藏引用外部類,所以我想出了通過這個簡單的類幾個問題:本地內部類

public class OuterClass { 

public void doSomething() { 
    JButton button = new JButton(); 
    button.addActionListener(new ActionListener() { 

     public void actionPerformed(ActionEvent e) {     
     } 
    }); 
    } 
} 

因此,我們必須駐留內部方法doSomething()一個局部內部類和我有一些問題參與其中。

  1. 這個本地內部類是否持有對OuterClass的引用,因爲它是本地的?

  2. 在方法doSomething()終止後,這個本地內部類是否保持內存?

  3. 是否有任何情況下OuterClass符合GC的條件,但本地內部類仍然被其他類引用?會發生什麼?

+4

你從未投過票,也沒有接受過你以前的問題的答案。請改進。 – asgs 2011-05-30 09:13:21

+0

很好的問題......至少對我而言。 – 2011-05-30 09:14:59

+2

我覺得喜歡這個問題,但後來看着你的個人資料,你從來沒有接受過答案,甚至從來沒有投票給任何人,所以對不起,你錯過了我的祝福。 – 2011-05-30 09:16:06

回答

8
  1. 是,內類具有對OuterClass實例的引用。

    您可以通過在方法中訪問OuterClass.this來驗證。

  2. 是的,內部類實例將在方法終止後繼續存在。

    離開該方法不會影響對象的生命週期。就像所有其他對象一樣,一旦沒有更多的引用,它就會變成符合GC的條件。由於JButton將持有對它的引用,它將保留在內存中。

  3. OuterClass實例不能只要內部類實例可以訪問就可以使用GC。

    原因是#1:內部類實例有一個對外部類實例的引用,這意味着只要內部類不能同時符合條件,外部類就不能成爲GC的符合條件(即兩個不再可達)。

+0

這其實並不完全正確。因爲在這種情況下,內部類實際上從未引用其封閉的'OuterClass'實例,所以不會引用它。因此,在問題3中,答案是'OuterClass'實例*可以* GC'd,即使內部類仍然被引用。當然,特別是對於這種情況,儘管如此。 – Dolda2000 2013-02-14 08:53:27