[英]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.