Articulo de referencia

Clase alta

En la programación orientada a objetos (POO), una clase interna o anidada es una clase declarada completamente dentro del cuerpo de otra clase o interfaz. Se distingue de una su...

En la programación orientada a objetos (POO), una clase interna o anidada es una clase declarada completamente dentro del cuerpo de otra clase o interfaz. Se distingue de una subclase , que deriva de otra clase.

Descripción general

Una instancia de una clase normal o de nivel superior puede existir por sí sola. En cambio, una instancia de una clase interna no puede crearse sin estar vinculada a una clase de nivel superior.

Consideremos la noción abstracta de un vehículo Carcon cuatro Wheelcomponentes. Nuestros Wheelcomponentes tienen una característica específica que depende de ser parte de nuestro vehículo Car. Esta noción no representa los Wheelcomponentes como Wheelcomponentes en una forma más general que podría formar parte de cualquier vehículo. En cambio, los representa como específicos de un vehículo Car. Podemos modelar esta noción utilizando clases internas de la siguiente manera:

Tenemos la clase de nivel superior Car. Las instancias de la clase Carse componen de cuatro instancias de la clase Wheel. Esta implementación particular de Wheeles específica de un automóvil, por lo que el código no modela la noción general de una rueda que se representaría mejor como una clase de nivel superior. Por lo tanto, está conectada semánticamente a la clase Cary el código de Wheelestá de alguna manera acoplado a su clase externa, siendo una unidad de composición de un automóvil. La rueda para un automóvil en particular es única para ese automóvil, pero para generalizar, la rueda es una unidad de agregación para el automóvil.

Las clases internas proporcionan un mecanismo para modelar con precisión esta conexión. Podemos referirnos a nuestra Wheelclase como Car.Wheel, Carsiendo la clase de nivel superior y Wheella clase interna.

clase Coche { clase Rueda { doble diámetro ; }int puertas = 4 ; double velocidadMáxima ; Ruedas [] ruedas = new Ruedas [ 4 ] ; }

Por lo tanto, las clases internas permiten la orientación a objetos de ciertas partes del programa que de otro modo no estarían encapsuladas en una clase.

Los segmentos de código más extensos dentro de una clase podrían modelarse o refactorizarse mejor como una clase de nivel superior independiente, en lugar de una clase interna. Esto haría que el código fuera más general en su aplicación y, por lo tanto, más reutilizable, pero podría ser una generalización prematura. Esto podría resultar más efectivo si el código tiene muchas clases internas con funcionalidad compartida.

Tipos de clases anidadas en Java

En Java existen cuatro tipos de clases anidadas :

Estático
  • Clase miembro estática, también llamadas clases anidadas estáticas [ 1 ] Se declaran . Al igual que otros elementos en el ámbito estático (es decir, métodos estáticos ), no tienen una instancia contenedora y no pueden acceder a las variables de instancia ni a los métodos de la clase contenedora. Son casi idénticas a las clases no anidadas, excepto por los detalles del ámbito (pueden referirse a variables y métodos estáticos de la clase contenedora sin calificar el nombre; otras clases que no son una de sus clases contenedoras deben calificar su nombre con el nombre de su clase contenedora). Las interfaces anidadas son implícitamente estáticas. static
Clases no estáticas / internas

Clase interna : Las siguientes categorías se denominan clases internas . Cada instancia de estas clases tiene una referencia a una instancia contenedora (es decir, una instancia de la clase contenedora), excepto las clases locales y anónimas declaradas en contexto estático. Por lo tanto, pueden hacer referencia implícitamente a variables de instancia y métodos de la clase contenedora. La referencia a la instancia contenedora se puede obtener explícitamente a través de . Las clases internas no pueden tener variables o métodos estáticos, excepto las variables constantes en tiempo de compilación. Cuando se crean, deben tener una referencia a una instancia de la clase contenedora; lo que significa que deben crearse dentro de un método de instancia o constructor de la clase contenedora, o (para clases miembro y anónimas) crearse utilizando la sintaxis . [ 1 ] EnclosingClassName.thisenclosingInstance.new InnerClass()

  • Clase miembro : se declaran fuera de una función (de ahí el término "miembro") y no se declaran . static
  • Clase local : Son clases que se declaran en el cuerpo de una función. Solo se puede hacer referencia a ellas en el resto de la función. Pueden usar variables locales y parámetros de la función, pero solo uno de los declarados . (Esto se debe a que la instancia de la clase local debe mantener una copia separada de la variable, ya que puede sobrevivir a la función; para evitar la confusión de dos variables modificables con el mismo nombre en el mismo ámbito, la variable se fuerza a ser no modificable). Puede ser muy útil para crear una clase con campos de tipo genérico, donde las variables de tipo se definen en el método. final
  • Clase anónima : Se trata de clases locales que se declaran e instancian automáticamente en medio de una expresión. Solo pueden heredar directamente de una clase o implementar una interfaz. Pueden especificar argumentos para el constructor de la superclase, pero no pueden tener un constructor (sin embargo, esto no supone una limitación, ya que pueden incluir un bloque de inicialización de instancia para realizar cualquier inicialización). 

Lenguajes de programación

  • Las clases internas se convirtieron en una característica del lenguaje de programación Java a partir de la versión 1.1.
  • Las clases anidadas también son una característica del lenguaje de programación D , Visual Basic .NET , Ruby , C++ y C# .
  • En Python , es posible anidar una clase dentro de otra clase, método o función.
  • C++ tiene clases anidadas que son como las clases miembro estáticas de Java, excepto que no se declaran con "static".
  • El lenguaje BETA introdujo esta noción de clases anidadas.
  • En C , es legal declarar una estructura anónima dentro de otra estructura, pero no puede tener nombre, ya que no existe la noción de tipos anidados (a diferencia de C++, donde anidar estructuras con nombre es legal).

Código de interfaz gráfica de usuario (GUI)

En Java, las clases internas locales se utilizan a menudo para definir funciones de devolución de llamada para el código de la interfaz gráfica de usuario (GUI). Los componentes pueden compartir un objeto que implementa una interfaz de gestión de eventos o extiende una clase adaptadora abstracta, que contiene el código que se ejecutará cuando se active un evento determinado.

Las clases internas anónimas también se utilizan cuando el código de gestión de eventos solo lo utiliza un componente y, por lo tanto, no necesita una referencia con nombre.

Esto evita un actionPerformed(ActionEvent)método monolítico extenso con múltiples ramas condicionales (if-else) para identificar el origen del evento. Este tipo de código suele considerarse desordenado, y las variaciones de clases internas se consideran mejores en todos los sentidos.

Referencias

  1. 1 2 (Oracle) Clases anidadas , Oracle.com Los tutoriales de Java. 
  • " Clases internas. ¿Para qué sirven las clases internas?"
  • Clases anidadas en D