¿Por qué las clases externas de Java pueden acceder a miembros privados de la clase interna?
Observé que las clases externas pueden acceder a variables de instancia privadas de las clases internas. ¿Cómo es esto posible? Aquí hay un código de muestra que demuestra lo mismo:
class ABC{
class XYZ{
private int x=10;
}
public static void main(String... args){
ABC.XYZ xx = new ABC().new XYZ();
System.out.println("Hello :: "+xx.x); ///Why is this allowed??
}
}
¿Por qué se permite este comportamiento?
La clase interna es solo una forma de separar limpiamente algunas funciones que realmente pertenecen a la clase externa original. Están pensados para ser utilizados cuando tengas 2 requisitos:
- Alguna funcionalidad de su clase externa sería más clara si se implementara en una clase separada.
- Aunque está en una clase separada, la funcionalidad está muy ligada a la forma en que funciona la clase externa.
Dados estos requisitos, las clases internas tienen acceso completo a su clase externa. Dado que son básicamente miembros de la clase externa, tiene sentido que tengan acceso a métodos y atributos de la clase externa, incluidos los privados.
Si desea ocultar los miembros privados de su clase interna, puede definir una interfaz con los miembros públicos y crear una clase interna anónima que implemente esta interfaz. Ejemplo a continuación:
class ABC{
private interface MyInterface{
void printInt();
}
private static MyInterface mMember = new MyInterface(){
private int x=10;
public void printInt(){
System.out.println(String.valueOf(x));
}
};
public static void main(String... args){
System.out.println("Hello :: "+mMember.x); ///not allowed
mMember.printInt(); // allowed
}
}