2013-03-18 18 views
6

Ho creato una classe interna in una classe interna:Come java implementa l'accesso alla classe che racchiude da una classe interiore interna?

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

sono stato sorpreso che Java permette la InnerInnerClass per accedere direttamente alla EnclosingClass. In che modo questo codice è implementato internamente da Java?

Il InnerInnerClass mantiene due puntatori (uno sul InnerClass e l'altro sul EnclosingClass) oi InnerInnerClass accedere al EnclosingClass attraverso il InnerClass?

+0

Con * "Come viene implementato questo codice?" *, Si intende come Java implementa internamente le classi interne? – m0skit0

+0

penso che lo faccia davvero. – ITroubs

+0

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

risposta

11

Hai solo bisogno di smontare la classe risultante con javap per vedere cosa sta succedendo:

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 

Quindi, prima si ottiene l'istanza della classe racchiude direttamente, allora si ottiene il "top-level" racchiudendo classe da quello.

+1

+1 L'unica risposta che in realtà risponde alla domanda. – m0skit0

+0

@ m0skit0 si. Potrebbe essere lui l'unico a capire il mio inglese. – gontard

+0

Purtroppo posso solo andare avanti una volta ...: D –

1

Se le classi interne non sono "statiche", contengono riferimenti interni alla classe in cui sono contenute.

1

A meno che non si faccia una classe interna statica, allora sì, ha un riferimento all'istanza in cui esiste e può fare riferimento ai membri (anche privati), lo stesso vale per le classi interne interne, le classi interne interne interne e presto.

+2

Penso che la domanda riguardi ** come ** è fatto internamente. – m0skit0

0

pubblica e privata è un problema di puntatore, è un problema del compilatore.

La domanda è uno del compilatore che applica l'ambito di una classe/variabile/metodo. Poiché il metodo privato getEnclosing() rientra nell'ambito di InnerClass, è possibile accedervi per tutta la classe.

Si noti che i puntatori non hanno nulla a che fare con il problema.
Utilizzando reflection è ancora possibile accedere ai membri privati ​​di una classe.

+0

Penso che significhi il contrario: come 'InnerClass' può accedere a' EnclosingClass'. – m0skit0

+0

@ m0skit0, sì, perché innerinner è una parte di inner, può accedere a qualsiasi cosa intorno ad esso, che abbia senso. – Johan

Problemi correlati