2012-05-14 166 views
1

我對以下內容缺乏瞭解:如果使用「簡寫」創建內部類的實例,即使我沒有創建它的顯式實例,訪問外部類也不是個好主意嗎?Java外部實例生命週期

例如,請考慮下面的代碼:

class OuterClass 
{ 
    int i; 

    OuterClass() { i = 2; } 

    class InnerClass 
    { 
     int get_parent_i() { return (OuterClass.this.i); } 
    } 
} 

下編譯並返回預期的結果(2):

OuterClass.InnerClass ic = new OuterClass().new InnerClass(); 

System.out.println(ic.get_parent_i()); 

我的困惑的事實,我沒有明確的莖創建一個OuterClass對象來實例化一個InnerClass對象,儘管似乎無論如何都存在。有人能告訴我發生了什麼,如果我因任何原因要麼訪問或忘記幻影實例?

非常感謝!

回答

7

你認爲new OuterClass()如果沒有明確創建它的實例,你會怎麼做? :)

您沒有明確存儲引用,但這是不同的事情。無論你如何處理結果,調用構造函數都會創建一個實例。內部類有一個建立在外部類的$this引用,所以只要你保留內部類,總會有一個對它的引用。

是否使用內部類是有史以來一個好主意是一個歷史上有爭議的話題,但沒有什麼特別的用法有什麼特別的錯誤。

-1

您的代碼的第一個塊是100%可接受且正確的。然而,這種模式通常被用作巨大外部類的內部機制(例如內部工廠)。

關於您的代碼的第二塊。如果您將兩個(內部&外部類)公開爲可見,則不需要創建OuterClass的對象。通過這種方式,InnerClass對其他包可見而不會觸及OuterClass。然而,如果你在你的例子中這樣做了,你將會有一個NullPointerException,因爲你正在使用Outerclass(i)的部分。

此外,如果你有。

public class OuterClass 
{ 
    static int i; 

    static { 
     i = 3; 
    } 

    OuterClass() { i = 2; } 

    public class InnerClass 
    { 
     int get_parent_i() { return (OuterClass.this.i); } 
    } 
} 

「我」會,除非你在未來發起並在OuterClass改變其價值爲2

希望我幫等於3!

+0

靜態變量與內部類的工作方式無關,也與公共/默認可見性無關。 – Charlie

+0

心靈先生:靜態是一種「幾乎」單身模式。因爲它與每個類都有關係,不管是任何包中的內部類還是外部類。 此外,我試圖解釋內容的行爲。顯示內部內容並不總是必須影響外部內容。除了它面臨一個靜態內容(變量,塊,功能)。 –