2010-02-08 14 views
18

In Java, la classe interna può accedere ai membri privati ​​della classe che li include. Ma la classe esterna può accedere ai membri privati ​​della classe interiore? Questo è indipendentemente dal fatto che la classe interiore sia statica o meno. Ho pensato che questo non è vero ma il seguente codice sembra compilare e funzionare bene.Nelle classi nidificate di Java, la classe che acclude può accedere ai membri privati ​​delle classi interne?

public class Outer { 
    class Inner { 
     private int i = 0; 
     private Inner() {} 
    } 

    public static void main(String[] args) { 
     Outer o = new Outer(); 
     Outer.Inner oi = o.new Inner(); 
     oi.i = 10; 
    } 
} 
+1

Sembra come previsto per me. Tranne te intendi dire oi.i = 10; sì? – Ben

+1

Duplicato: http://stackoverflow.com/questions/1801718/outer-java-class-isable-to-access-inner-class-private-members – finnw

+3

Non capisco. Il codice è proprio qui. Conosco l'uscita. So che funziona. Volevo capire il ragionamento che ci sta dietro. Pensi che questa domanda non meriti una risposta? – user236215

risposta

23

Sì, va bene. Dal JLS, section 6.6.1:

In caso contrario, se il membro o il costruttore è dichiarato private, quindi l'accesso è consentito se e solo se si verifica all'interno del corpo della classe di livello superiore (§7.6) che racchiude la dichiarazione di il membro o il costruttore.

È anche possibile fare riferimento a un membro privato di tipo nidificato X all'interno di un altro tipo annidato Y purché condividano una classe di livello superiore.

A livello di bytecode, credo che tutto questo sia implementato aggiungendo metodi sintetici di accesso ai pacchetti.

Problemi correlati