簡體   English   中英

內部類的語法糖是什么?

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

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