[英]Are inner classes syntactic sugar of what?
來自Java的堅果殼
內部類只是語法糖,因此對內部類的鎖定對封閉類沒有影響(反之亦然)。
內部類的語法糖是什么? 換句話說,內部類可以根據其他更基本的結構等效地重寫嗎?
謝謝。
內部類, Inner
,像這樣:
package some.pkg;
class Outer {
class Inner {}
}
編譯時成為這樣的類:
package some.pkg;
class Outer$Inner {
private final Outer this$0;
Outer$Inner(Outer this$0) {
this.this$0 = this$0;
}
}
您可以手動聲明此類。
嗯, 幾乎就是這樣。 有一些細節可以提供Inner
成員對Outer
實例的訪問; 但這是廣泛的。
哦,這很有趣。 有在生成的代碼的差。
如果你編譯“含糖”代碼, Outer$Inner
的反編譯字節碼是:
some.pkg.Outer$Inner(some.pkg.Outer);
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:Lsome/pkg/Outer;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":()V
9: return
如果您反編譯“desugared”版本(使用$
s),它是:
some.pkg.Outer$Inner(some.pkg.Outer);
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #2 // Field this$0:Lsome/pkg/Outer;
9: return
換句話說,在this$0
字段在第一種情況下調用父類的構造之前分配,但在之后的第二。
我能看到的唯一區別是它允許你將Outer.this
作為參數傳遞給父構造函數(例如super(Outer.this)
;或允許父構造函數使用Outer.this
的值調用方法。 (這是粗略的,因為在調用該方法時可能尚未初始化其他字段;但仍然允許)。
所以,我把它送回去:你不能完全實現手工同一類; 但兩者之間的區別僅在一個非常罕見的用例中很重要。
正如在注釋中所提到的,內部類只是用於聲明一個單獨的頂級類的語法糖。如果你想創建僅由封閉類使用的類,那么基本上就有兩個類的區別是你使用它們(邏輯分組在一個地方使用的類。 在這種情況下,您可能希望從Java文檔中使用它們(並添加此語法糖)的原因是:
這是一種邏輯分組僅在一個地方使用的類的方法。
它增加了封裝。
它可以使代碼更具可讀性和可維護性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.