Java LanguageClases anidadas e internas


Introducción

Usando Java, los desarrolladores tienen la capacidad de definir una clase dentro de otra clase. Tal clase se llama una clase anidada . Las clases anidadas se denominan clases internas si se declararon como no estáticas; de lo contrario, simplemente se denominan clases anidadas estáticas. Esta página es para documentar y proporcionar detalles con ejemplos sobre cómo usar clases anidadas e internas de Java.

Sintaxis

  • clase pública OuterClass {clase pública InnerClass {}} // las clases internas también pueden ser privadas
  • clase pública OuterClass {clase estática pública StaticNestedClass {}} // Las clases anidadas estáticas también pueden ser privadas
  • método de anulación público () {clase privada LocalClass {}} // Las clases locales son siempre privadas
  • SomeClass anonymousClassInstance = new SomeClass () {}; // Las clases internas anónimas no pueden ser nombradas, por lo tanto el acceso es discutible. Si 'SomeClass ()' es abstracto, el cuerpo debe implementar todos los métodos abstractos.
  • SomeInterface anonymousClassInstance = new SomeInterface () {}; // El cuerpo debe implementar todos los métodos de interfaz.

Observaciones

Terminologia y clasificacion

La especificación de lenguaje Java (JLS) clasifica los diferentes tipos de clases de Java de la siguiente manera:

Una clase de nivel superior es una clase que no es una clase anidada.

Una clase anidada es cualquier clase cuya declaración ocurre dentro del cuerpo de otra clase o interfaz.

Una clase interna es una clase anidada que no se declara explícita o implícitamente como estática.

Una clase interna puede ser una clase miembro no estática , una clase local o una clase anónima . Una clase miembro de una interfaz es implícitamente estática, por lo que nunca se considera una clase interna.

En la práctica, los programadores se refieren a una clase de nivel superior que contiene una clase interna como la "clase externa". Además, hay una tendencia a usar "clase anidada" para referirse solo a clases anidadas estáticas (explícita o implícitamente).

Tenga en cuenta que existe una relación estrecha entre las clases internas anónimas y las lambdas, pero las lambdas son clases.

Diferencias semanticas

  • Las clases de nivel superior son el "caso base". Son visibles a otras partes de un programa sujeto a reglas de visibilidad normales basadas en la semántica del modificador de acceso. Si no son abstractos, se pueden crear instancias de cualquier código en el que los constructores relevantes sean visibles según los modificadores de acceso.

  • Las clases anidadas estáticas siguen las mismas reglas de acceso e instanciación que las clases de nivel superior, con dos excepciones:

    • Una clase anidada se puede declarar como private , lo que la hace inaccesible fuera de su clase de nivel superior.
    • Una clase anidada tiene acceso a los miembros private de la clase adjunta de nivel superior y toda su clase probada.

    Esto hace que las clases anidadas estáticas sean útiles cuando necesita representar múltiples "tipos de entidades" dentro de un límite de abstracción estricto; por ejemplo, cuando las clases anidadas se utilizan para ocultar "detalles de implementación".

  • Las clases internas agregan la capacidad de acceder a variables no estáticas declaradas en los ámbitos adjuntos:

    • Una clase miembro no estática puede referirse a variables de instancia.
    • Una clase local (declarada dentro de un método) también puede referirse a las variables locales del método, siempre que sean final . (Para Java 8 y versiones posteriores, pueden ser efectivamente definitivas ).
    • Una clase interna anónima se puede declarar dentro de una clase o un método, y puede acceder a las variables de acuerdo con las mismas reglas.

    El hecho de que una instancia de clase interna pueda referirse a variables en una instancia de clase adjunta tiene implicaciones para la creación de instancias. Específicamente, se debe proporcionar una instancia adjunta, ya sea implícita o explícitamente, cuando se crea una instancia de una clase interna.

Clases anidadas e internas Ejemplos relacionados