2013-03-18 47 views
6

我曾在一個內部類中創建一個內部類:java如何從內部內部類實現對封閉類的訪問?

public class EnclosingClass { 

    public class InnerClass { 
     private EnclosingClass getEnclosing() { 
      return EnclosingClass.this; 
     } 

     public class InnerInnerClass { 
      private InnerClass getEnclosing() { 
       return InnerClass.this; 
      } 

      private EnclosingClass getEnclosingOfEnclosing() { 
       return EnclosingClass.this; 
      } 
     }   
    } 
} 

我一直感到驚訝的Java允許InnerInnerClass直接在EnclosingClass訪問。這段代碼是如何由Java內部實現的?

InnerInnerClass的保持兩個指針(一個在InnerClass和另一個在EnclosingClass)或InnerInnerClass訪問EnclosingClass通過InnerClass

+0

隨着*「這怎麼實現代碼?」 *,你的意思是如何的Java內部實現內部類? – m0skit0 2013-03-18 16:54:10

+0

我認爲他的確如此。 – ITroubs 2013-03-18 16:54:42

+0

看到這個http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class – ITroubs 2013-03-18 16:57:04

回答

11

你只需要拆卸導致類javap的,看看發生了什麼事情:

private EnclosingClass getEnclosingOfEnclosing(); 
    Code: 
    0: aload_0 
    1: getfield  #1     // Field this$1:LEnclosingClass$InnerClass; 
    4: getfield  #3     // Field EnclosingClass$InnerClass.this$0:LEnclosingClass; 
    7: areturn 

所以首先它得到直接包圍類的實例,那麼它獲得了「頂級」從那裏封閉課程。

+1

+1實際回答問題的唯一答案。 – m0skit0 2013-03-18 16:59:37

+0

@ m0skit0是的。也許他是唯一懂我英語的人。 – gontard 2013-03-18 17:01:39

+0

不幸的是,我只能一勞永逸......:D – 2013-03-18 17:02:13

1

如果內部類不是「靜止」,它們包含在內部對它們所包含的類的引用。

1

除非你做一個內部類靜態的,那麼是的,它確實有它內部存在的實例的引用,並可以參考它的成員(含民辦),同樣也適用於內部內部類,裏面的內內部類和等等。

+2

我認爲問題的關鍵是**如何在內部完成此操作。 – m0skit0 2013-03-18 16:57:33

0

公共和私人是一個指針的問題,這是一個編譯器的問題。

問題是編譯器強制執行類/變量/方法的範圍之一。 由於私有方法getEnclosing()屬於InnerClass的範圍,因此可以在整個該類中進行訪問。

注意,指針都無關的問題。
使用reflection您仍然可以訪問班級的私人成員。

+0

我認爲他的意思是相反的:InnerClass如何訪問'EnclosingClass'。 – m0skit0 2013-03-18 16:56:33

+0

@ m0skit0,是的,因爲innerinner是內部的一部分,它可以訪問它的任何東西,這是有道理的。 – Johan 2013-03-18 17:04:04