¿Por qué las clases externas de Java pueden acceder a miembros privados de la clase interna?

Resuelto Harish asked hace 14 años • 10 respuestas

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?

Harish avatar Nov 26 '09 12:11 Harish
Aceptado

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:

  1. Alguna funcionalidad de su clase externa sería más clara si se implementara en una clase separada.
  2. 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.

Kaleb Brasee avatar Nov 26 '2009 05:11 Kaleb Brasee

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
    }
}
Ich avatar Feb 28 '2012 08:02 Ich