2010-02-08 15 views
18

En Java, la clase interna puede acceder a miembros privados de la clase adjunta. ¿Pero puede la clase externa acceder a miembros privados de la clase interna? Esto es independientemente de si la clase interna es estática o no. Pensé que esto no era cierto, pero el siguiente código parece compilar y funciona bien.En clases anidadas de Java, ¿puede la clase adjunta acceder a miembros privados de clases internas?

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

Parece como esperaba para mí. Excepto que te refieres a oi.i = 10; ¿sí? – Ben

+1

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

+3

No entiendo. El código está aquí. Sé la salida. Sé que funciona Quería entender el razonamiento detrás de esto. ¿Crees que esta pregunta no merece una respuesta? – user236215

Respuesta

23

Sí, está bien. Desde el JLS, section 6.6.1:

De lo contrario, si el miembro o constructor se declara private, se podrá acceder si y sólo si se produce dentro del cuerpo de la clase de nivel superior (§7.6) que encierra la declaración de el miembro o constructor.

Incluso puede hacer referencia a un miembro privado del tipo anidado X dentro de otro tipo anidado Y siempre que compartan una clase de nivel superior.

En el nivel de bytecode, creo que todo esto se implementa mediante la adición de métodos sintéticos de acceso a paquetes.

Cuestiones relacionadas