2013-03-18 16 views
6

Ich habe eine innere Klasse in einer inneren Klasse erstellt:Wie Java implementiert den Zugriff auf die umschließende Klasse von einer inneren inneren Klasse?

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; 
      } 
     }   
    } 
} 

ich überrascht gewesen, dass Java die InnerInnerClass die EnclosingClass direkt zugreifen kann. Wie wird dieser Code intern von Java implementiert?

Die InnerInnerClass hält zwei Zeiger (eine auf der InnerClass und die andere auf dem EnclosingClass) oder die InnerInnerClass Zugriff auf die EnclosingClass durch die InnerClass?

+0

Mit * "Wie ist dieser Code implementiert?" *, Meinen Sie, wie Java interne Klassen intern implementiert? – m0skit0

+0

ich denke, er meint das. – ITroubs

+0

siehe http://stackoverflow.com/questions/70324/java-inner-class-and-static-nested-class – ITroubs

Antwort

11

Sie müssen nur die resultierende Klasse mit javap auseinander zu nehmen, um zu sehen, was los ist:

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 

Also zuerst bekommt es die Instanz der direkt umgebende Klasse, dann wird es das „Top-Level“ umschließende Klasse von diesem.

+1

+1 Die einzige Antwort, die tatsächlich die Frage beantwortet. – m0skit0

+0

@ m0skit0 ja. Vielleicht war er die einzige, die mein Englisch verstand. – gontard

+0

Leider kann ich nur einmal upvoten ...: D –

1

Wenn die inneren Klassen nicht 'statisch' sind, enthalten sie intern Verweise auf die Klasse, in der sie enthalten sind.

1

Wenn Sie eine innere Klasse nicht statisch machen, dann hat sie einen Verweis auf die Instanz, in der sie existiert, und kann auf sie verweisen (einschließlich private), dasselbe gilt für innere innere Klassen, innere innere Klassen und bald.

+2

zeigt. Ich denke, die Frage ist, wie ** das intern gemacht wird. – m0skit0

0

öffentlich und privat ist ein Zeigerproblem, es ist ein Compiler-Problem.

Die Frage ist eine der Compiler erzwingt den Umfang einer Klasse/Variable/Methode. Da die private Methode getEnclosing() in den Gültigkeitsbereich InnerClass fällt, kann auf diese Klasse zugegriffen werden.

Beachten Sie, dass Zeiger nichts mit dem Problem zu tun haben.
Mit reflection können Sie weiterhin auf private Mitglieder einer Klasse zugreifen.

+0

Ich glaube, er meint das Gegenteil: Wie 'InnerClass' auf' EnclosingClass' zugreifen kann. – m0skit0

+0

@ m0skit0, ja, weil innerinner ist ein Teil des inneren, es kann alles um ihn herum zugreifen, das macht Sinn. – Johan

Verwandte Themen