2013-08-07 13 views
5

Ho appena scoperto che una classe interna può accedere membro privato di un'altra classe interna come questo:Perché la classe interna può accedere a un membro privato di un'altra classe interiore?

public class TestOutter { 
    class TestInner1 { 
     private int mInt = 1; 
    } 
    class TestInner2 { 
     public int foo(TestInner1 value) { 
      return value.mInt; 
     } 
    } 
} 

Metodo foo di TestInner2 può accedere al membro privato Zecca di TestInner1.

Ma non ho mai visto prima questo caso. Non conosco il significato di lasciare che il codice in TestInner2 possa accedere al membro privato di TestInner1.

Sono stato cercato sulla classe interna in google, nessuno dei risultati della ricerca mostra che la classe interna ha questa caratteristica. Guardo anche a The Java Language Specification, ma non ne parlo ancora.

+0

praticamente tutto all'interno di una definizione di classe "esterna" può accedere ai membri privati. – jtahlborn

+1

È possibile fare riferimento a questa domanda http://stackoverflow.com/questions/1801718/why-can-outer-java-classes-access-inner-class-private-members?lq=1 – san

+0

Perché questa logica è adatta a voi? 'TestInner2' è parte integrante di' TestOutter' e poiché 'TestOutter' ha accesso a' TestInner1', quindi 'TestInner2'. Mi sembra soddisfacente. –

risposta

4

"Altrimenti, se il membro o il costruttore è dichiarato privato, l'accesso è consentito se e solo se si verifica all'interno del corpo della classe di livello superiore (§7.6) che include la dichiarazione del membro o del costruttore." JLS 6.6.1 In questo caso, TestOutter è la classe di livello superiore, quindi tutti i campi private al suo interno sono visibili.

Fondamentalmente, lo scopo di dichiarare un membro private è di contribuire a garantire la correttezza mantenendo altre classi (sottoclassi o altro) da interferire con esso. Poiché una classe di livello superiore è l'unità di compilazione Java, la specifica presuppone che l'accesso all'interno dello stesso file sia stato gestito correttamente.

+0

Grazie! La tua risposta è abbastanza chiara su questa domanda! – user1260771

2

Questo perché la classe interna, come membro della classe esterna, ha accesso a tutte le variabili private della sua classe esterna. E poiché l'altra classe interna è anche un membro della classe esterna, tutte le sue variabili private sono anch'esse accessibili.

Modifica: Pensa che hai un paio di fortini a cuscino (classi interne) in una casa (classe esterna), una tua e l'altra i tuoi fratelli. I tuoi forti sono entrambi nella casa in modo da avere accesso a tutte le cose nella tua casa. E mamma (Java) è totalmente zoppa e dice che devi condividere con tuo fratello, perché tutto in casa è di tutti gli altri e se vuoi il tuo forte devi comprarlo con i tuoi soldi (fai un altro corso?).

Problemi correlati