2012-10-30 63 views
0

我有一個內部類(非靜態),它在初始化時使用對封閉類的引用。內部類是否保持對封閉類的引用?必須內部類有對封閉類的引用嗎?

class Enclosing { 
    class Inner { 
    private final ABC innerField = outerField.computeSomething(); 
    } 

    private final XYZ outerField = something(); 
} 

UPDATE

我非常清楚,一個可以參考外類Enclosing.this

但是,如果該類不使用引用,必須引用在編譯後有嗎?即使參考僅用於初始化,是否有必要?

它說什麼內部類總是持有對外部類的引用?

回答

7

非靜態嵌套類總是持有對封閉類的引用。在你的例子中,你可以參考Inner的封閉類Enclosing.this

JLS 8.1.3 "Inner classes and Enclosing Instances"

「的我的一類的O的直接內部類C的帶O的實例相關聯,被稱爲我的立即封閉實例立即封裝的對象的實例的實例。 ,如果有的話,是在創建對象時確定的(第15.9.2節)。「

+0

它說的地方*永遠*擁有參考 - 即使你從不使用它? –

+0

僅供參考,我正在瀏覽JLS 8.1.3「內部類和外部實例」,但我沒有在任何地方看到http://docs.oracle.com/javase/specs/jls/se7/html/jls -8.html#jls-8.1.3 –

+0

所有內部類都是非靜態的。請參閱JLS。 – EJP

-1

有嵌套類的兩種情況:

靜態嵌套類。嵌套類不保留對外部類的引用。

非靜態嵌套類。嵌套類保持對外部類的引用。

擴展外層類的靜態嵌套類的情況並不像 擴展外層類的非靜態嵌套類那麼有趣。

要記住一個重要的事情是非靜態嵌套類簡單地稱爲內部類。

+0

它在哪裏說*總是*保持一個參考,如果它不被使用? –

+0

根據定義,內部類是非靜態的。請參閱JLS。有兩種* nested *類。答案是矛盾的。 – EJP

0

它在哪裏說內部類總是擁有對外部類的引用?

same place it defines the Outer.this syntax。這個語法的存在就是參考的存在。沒有任何跡象表明,如果不使用它,它會被壓制。

+0

這個定義在哪裏? –

+0

@MichaelDeardeuff當然,在Java語言規範中。 – EJP

+0

@downvoter熱愛你的工作。對JLS有問題? – EJP

1

是的。內部類(或非靜態嵌套類)就像外部類的任何其他實例成員一樣,因此總是需要包含類的引用。

+0

根據定義,所有內部類都是非靜態的。 – EJP