2011-04-24 19 views
5

La clase interna es la clase definida dentro de una clase, y la clase interna se puede declarar como pública, privada, protegida. Si la clase interna se define como privada y protegida, ¿puede la clase externa acceder a los miembros de la clase interna? y puede la clase interna tener acceso a los miembros de la clase externa?¿Puede una clase externa acceder a los miembros de la clase interna?

+9

ha intentado? Probablemente sea más rápido probar cosas como estas tú mismo. – whirlwin

Respuesta

13

Si la clase interna define como privada y protegido, puede acceder clase externa los miembros de la clase interna?

Sí. Estos calificadores solo afectarán la visibilidad de la clase interna en las clases que se derivan de la clase externa.

¿Puede la clase interna acceder a miembros de clase exterior?

Sí, incluidos los declarados private, al igual que cualquier método de instancia puede.

+0

podemos simplemente llamar directamente a los métodos de clase internas de la clase externa o por el objeto de la clase interna @Hippo –

+0

@MuhammadBabar por el objeto de la clase interna – light

1

"Una clase anidada es una clase definida dentro de otra clase. Una clase anidada debería existir sólo para servir a su clase envolvente. Si una clase anidada sería útil en algún otro contexto, entonces debería ser una clase de nivel superior Hay cuatro tipos de clases anidadas :.. las clases miembro estáticas, clases de miembros no estáticos, clases anónimas, y las clases locales, pero el primer tipo se conoce como interiores clases ".

(Joshua Bloch, del libro Effective Java.)

En cuanto a sus preguntas: es muy fácil de probar por sí mismo. Pero la respuesta es sí (incluso para los miembros private), siempre que no intente acceder a un miembro no estático (que no sea de una referencia) desde un contexto estático o intente acceder a un miembro que se encuentre en un ámbito inaccesible .

Es decir, mucho como uno esperaría =).

21

En general, puede (acceder a campos privados en clases internas y viceversa). El código siguiente se compila bajo Eclipse:

public class Outer { 

    private int x; 

    public void f() { 
    Inner inner = new Inner(); 
    inner.g(); 
    inner.y = 5; 
    } 

    private class Inner { 
    private int y; 

    public void g() { x = 5; } 
    }  
} 

Dicho esto, se puede configurar el IDE/compilador para tratar los accesos a campos tales como errores (en Eclipse esta configuración se denomina "Acceso al miembro no accesible de un tipo envolvente ", en Preferencias -> Java -> Compilador -> Error/Advertencias -> Estilo de código)

+0

Intenté hacer esto, y me dio este error en Android 'intentado leer del campo 'int com.backspace.memebook.MainActivity $ MyTask.counter' en una referencia de objeto nulo' –

1

Sí! Puede acceder a un miembro de la clase interna desde la clase externa y viceversa (independientemente del modificador de acceso). Sin embargo, para una clase anidada estática no puede acceder a su campo con sólo el nombre del campo, y hay que acceder a ella como

InnerClass.staticInnerField 

aunque se puede acceder a los campos estáticos de la clase externa de la clase interna directamente por los nombres de los campos.

0

explicación está en el contexto de la clase interna periódica [clases internas regulares no pueden tener los miembros estáticos dentro de ellos declarados]

puede acceder a cualquier campo de la clase externa de clase interna directamente.

class Outer { 
    private static int x = 0; 

    class Inner { 
    void print() { 
     System.out.println(x); // x can be directly accessed 
    } 
    } 

    public static void main(String[] args) { 
    new Outer().new Inner().print(); 
    } 
} 

Incluso la clase Outer puede acceder a cualquier campo de la clase interna pero a través del objeto de la clase interna.

class Outer { 
    private class Inner { 
    private int x = 10; 
    } 

    void print() { 
    Inner inner = new Inner(); 
    System.out.println(inner.x); 
    } 

    public static void main(String[] args) { 
    Outer outer = new Outer(); 
    outer.print(); 
    } 
} 
Cuestiones relacionadas