Clase interna

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 27 de agosto de 2014; las comprobaciones requieren 20 ediciones .

Clase interna o anidada ( clase interna en inglés  ): en la programación orientada a objetos , una clase que está completamente definida dentro de otra clase.

Las clases anidadas están soportadas en el lenguaje de programación Java desde la versión 1.1, C# y otros lenguajes en la plataforma .NET, así como en el lenguaje de programación D y en C++ .

Resumen

Una instancia de una clase ordinaria (externa) puede existir como un objeto independiente. Su existencia no requiere la presencia de definiciones de otras clases o sus instancias. En el caso de una clase interna, su instancia no puede existir sin estar vinculada a su clase de nivel superior envolvente o su instancia.

Clases internas en el lenguaje Java

Hay 4 tipos de clases internas en Java :

Clases internas (no estáticas)

Una instancia de una clase interna solo puede existir cuando existe una instancia específica de la clase externa. Tal conexión lógica determina la sintaxis para crear objetos: primero, se crea un objeto de la clase externa y, luego, se crea un objeto de la clase interna sobre esta base.

Las clases internas no estáticas se declaran dentro de la clase externa principal. Las instancias de dichas clases tienen acceso a los campos public, y protectedde la clase externa. Así como métodos estáticos y no estáticos de una instancia externa con cualquier modificador de acceso. Debido al hecho de que las instancias de la clase interna siempre están ligadas lógicamente a las instancias de la clase circundante, no pueden contener (aunque pueden heredar de un ancestro) la definición de campos, métodos y clases estáticos (excepto las constantes). [una]defaultprivate

Un ejemplo de una declaración de clase interna:

clase ClaseExterna { campoexterior privado int ; clase ClaseInterior { int getOuterField () { devuelve OuterClass . esto _ campoexterior ; // esta línea de código demuestra el concepto de cierre. } } }

La creación de la clase descrita se puede describir mediante el siguiente bloque de código:OuterClass.InnerClass inner = new OuterClass().new InnerClass();

Clases estáticas anidadas

Se declaran dentro de la clase principal y se indican con la palabra clave static. Los objetos de tales clases no tienen acceso a los miembros de la clase externa, excepto los estáticos. Esto se debe al hecho de que un objeto específico de la clase externa no se usa para crear dicha clase y, en el momento de la ejecución del código de la clase interna, es posible que no haya ningún objeto externo. Las instancias de clases anidadas estáticas pueden contener campos, métodos y clases estáticos, a diferencia de otros tipos de clases internas.

Un ejemplo de una declaración de clase estática anidada:

clase ClaseExterna { campoexterior privado int ; static int staticOuterField ; clase estática _ _ int getOuterField () { devuelve OuterClass . esto _ campoexterior ; // esta línea de código dará como resultado un error de compilación. } int getStaticOuterField () { devuelve OuterClass . campoexterior estático ; // esta línea de código es correcta. } } }

La creación de la clase anidada estática descrita se puede describir mediante el siguiente bloque de código:OuterClass.StaticInnerClass staticInner = new OuterClass.StaticInnerClass();

Clases locales

Se declaran dentro de los métodos de la clase principal. Solo se puede utilizar dentro de estos métodos. Tener acceso a los miembros de la clase externa. Tienen acceso tanto a las variables locales como a los parámetros del método bajo una condición: las variables y los parámetros utilizados por la clase local deben declararse final. No puede definir (pero puede heredar) campos estáticos, métodos y clases (excepto constantes). [2]

Ejemplo:

clase ClaseExterna { campoexterior privado int ; void methodWithLocalClass ( final int finalParameter ) { int noVarFinal = 0 ; noFinalVar ++ ; clase ClaseInteriorLocal { void getOuterField () { int a = noFinalVar ; // esta línea de código dará como resultado un error de compilación. las variables no finales no están disponibles fuera del contexto. int b = ClaseExterna . esto _ campoexterior ; // esta línea de código demuestra llamar a un miembro de la clase adjunta. } int getParameter () { volver parámetro final ; // esta línea de código demuestra el acceso a una variable final fuera de contexto. } } } }

La creación de la clase local descrita solo es posible dentro del propio método, estrictamente debajo del código de declaración de la propia clase. Ejemplo de código de creación:InnerLocalClass innerLocal = new InnerLocalClass();

Clases anónimas (sin nombre)

Se declaran dentro de los métodos de la clase principal. Solo se puede utilizar dentro de estos métodos. A diferencia de las clases locales, las clases anónimas no tienen nombre. El requisito principal para una clase anónima es que debe heredar de una clase existente o implementar una interfaz existente. No puede definir (pero puede heredar) campos estáticos, métodos y clases (excepto constantes). Ejemplo:

clase ClaseExterna { /** * Al definir una clase anónima, se aplicó polimorfismo: la variable oyente * contiene una instancia de una clase anónima que implementa una existente * Interfaz de ActionListener. **/ void methodWithAnonymousClass ( intervalo int final ) { Oyente ActionListener = new ActionListener () { public void actionPerformed ( evento ActionEvent ) { sistema _ fuera _ println ( "Esta línea se imprime cada " + intervalo + " segundos." ); } }; Temporizador t = nuevo Temporizador ( intervalo , oyente ); // objeto de clase anónimo usado dentro del método. t . inicio (); } }

Clases internas en otros lenguajes de programación

PHP 7 tiene un mecanismo para describir clases anónimas; sin embargo, a diferencia de Java, no se requiere que las clases anónimas hereden de una clase existente o implementen una interfaz existente debido a la naturaleza dinámica del lenguaje. Ejemplo:

// Código anterior a PHP 7 registrador de clase { registro de función pública ( $msg ) { echo $mensaje ; } } $util -> setLogger ( nuevo registrador ()); // Código PHP 7+ $util -> setLogger ( nueva clase { registro de función pública ($ msg) { echo $mensaje; } });

Véase también

Literatura

Cay S. Horstmann y Gary Cornell, Core Java , octava edición (Volumen I). Prentice Hall, 2003. ISBN 978-0132354769 ( enlace a la página del libro )

Notas

  1. Oráculo. Los tutoriales de Java™. Clases internas . Documentación de Oracle . Consultado el 12 de abril de 2016. Archivado desde el original el 22 de marzo de 2016.
  2. Clases locales (Los tutoriales de Java™ > Aprendiendo el lenguaje Java > Clases y objetos) . docs.oracle.com. Consultado el 12 de abril de 2016. Archivado desde el original el 31 de marzo de 2016.

Enlaces