簡體   English   中英

Java外部類實例生存期

[英]Java Outer Class Instance Lifetime

我缺乏以下知識:如果我使用“速記”創建內部類的實例,即使沒有創建顯式實例,訪問內部類也不是一個好主意嗎?

例如,考慮以下代碼:

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對象的事實,盡管無論如何似乎都存在。 有人可以告訴我發生了什么嗎?是否由於任何原因我應該訪問還是忘了幻影實例?

非常感謝!

如果未明確創建new OuterClass()的實例,您怎么看? :)

您沒有顯式存儲對此的引用 ,但這是另一回事。 不管您對結果如何處理,調用構造函數都會創建一個實例。 內部類具有內置的$this返回外部類的引用,因此只要保留內部類,就始終會保留對它的引用。

使用內部類是否曾經是一個好主意,這在歷史上是一個有爭議的話題,但是這種特殊用法並沒有特別的錯誤。

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

關於代碼的第二個塊。 如果同時公開(內部和外部類),則無需創建OuterClass的對象。 這樣,其余的包就可以看到InnerClass,而無需接觸OuterClass。

但是,如果您在示例中執行此操作,則將出現NullPointerException,因為您使用的是(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,否則“ i”將等於3。

希望我能幫上忙!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM