假設我有一個Outer
類。可以說有一個非靜態成員類Inner
。因此,如果Outer
類聲明類型爲Inner
的字段並且按照定義,則Outer
實例將引用Inner
的實例。但是Inner實例如何也有一個隱含參考Outer
?這個關聯何時創建?隱式引用Java中的封閉類
回答
一類的O的直接內類C的我一個實例爲O的一個實例,被稱爲 立即封閉實例1相關的 。對象的立即封閉實例(如果有的話)是 ,在創建對象時(第15.9.2節)確定。
代碼
class Outer {
class Inner {
void printOuterThis() {
System.out.println(Outer.this);
}
}
}
Outer.Inner oi = new Outer().new Inner();
大多是等效於這樣的:
class Outer {
static class Inner {
Outer outerThis;
public Inner(Outer outerThis) {
this.outerThis = outerThis;
}
void printOuterThis() {
System.out.println(outerThis);
}
}
}
public class Scratch {
public static void main(String[] args) {
Outer.Inner oi = new Outer.Inner(new Outer());
}
}
編譯器自動發出代碼,不會在第二發生的情況:其保持的值的字段(this$0
Outer.this
)用於隱式引用,並轉換Inner
的所有構造函數,並調用它們以添加此字段的初始化。
但是,您實際上無法編譯第二個示例嗎? – Alex 2013-02-08 17:27:18
@Alex有一堆錯誤,我從內存中寫入它。現在應該沒問題。 – millimoose 2013-02-08 17:30:26
對,我改變了第二個示例以匹配反編譯器告訴我的確實發生的事情。 – millimoose 2013-02-08 17:35:37
你有它周圍的其他方法:
public class Outer {
void foo() {
// In this Outer method, we have no implicit instance of Inner.
innerbar(); // Compiler error: The method bar() is undefined for the type Outer
Inner.this.innerbar();// Compiler error: No enclosing instance of the type Outer.Inner is accessible in scope
// instead, one has to create explicitly instance of Inner:
Inner inner1 = new Inner();
Inner inner2 = new Inner();
inner1.innerbar(); // fine!
}
class Inner {
void innerbar() {};
void callOuter() {
// But Inner has an implicit reference to Outer.
callMe();
// it works also through Outer.this
Outer.this.callMe();
}
}
void callMe() {}
}
- 1. 如何從Java中的匿名內部類獲取對封閉類的引用?
- 2. PHP,封閉類
- 3. 封閉類型
- 4. 必須內部類有對封閉類的引用嗎?
- 5. 引用封閉類型的類型參數
- 6. 封閉類的C#類型
- 7. 在封閉中引用「私有方法」
- 8. 使用類中的封閉形式的值
- 9. 嵌套類型的maintype不能隱藏封閉類型
- 10. 處理Java錯誤:嵌套類型(節點)不能隱藏封閉類型
- 11. 不是封閉類
- 12. 用宏隱藏封閉樣板?
- 13. 封閉類vs申報類
- 14. 會有一個隱式引用單身封閉實例的匿名類實例導致內存泄漏?
- 15. 引用來自內部類的封閉實例
- 16. 嵌套類型不能隱藏封閉類型
- 17. java中的未封閉字符文字
- 18. Java lambda表達式有沒有方法可以引用封閉對象?
- 19. 正則表達式的封閉式「」(2個單引號)
- 20. 如何將值傳播回Java中的封閉類?
- 21. 封閉實例無效時的封閉類型行爲
- 22. C#中的封閉式檢測.net
- 23. 如何引用where關閉中的隱式參數
- 24. 爲什麼封閉類
- 25. 一個封閉類(不父)
- 26. 未封閉字符類
- 27. MainActivity.this不是封閉類AsyncTask
- 28. 默認參數類封閉
- 29. 錯誤:不是封閉類
- 30. PHP封閉在類實例
「因此,一個外部實例始終具有內在的實例的引用,這是由定義。」 - 這不是真的。 – millimoose 2013-02-08 17:14:32
@millimoose爲什麼不是真的? – Geek 2013-02-08 17:15:31
如果外部類爲其明確聲明瞭一個字段,那麼外部類的實例將僅保存對內部類實例的引用。 – Alex 2013-02-08 17:18:50