Clases Internas

Resumen del capítulo 10 (Clases Internas) del "Libro Thinking in Java (4ta Edición)".

Introducción

Las clases internas nos permiten agrupar clases relacionadas y controlar la visibilidad mutua de esas clases. Un objeto de una clase interna conoce todos los detalles de la instancia de su clase contenedora y puede comunicarse con ella. Esto se logra debido a que la instancia de la clase interna dispone de un enlace al objeto contenedor que la ha creado (de este modo se puede acceder a todos los miembros del objeto contenedor). Solo se puede instanciar una clase interna a través de una referencia al objeto de la clase contenedora.
Ver ejemplo: Main01.java

Desde una instancia de una clase interna se puede referenciar al objeto contenedor de la siguiente manera: NombreClaseContenedra.this
Como se puede ver en el ejemplo Main01.java, no es posible crear un objeto de la clase interna a menos que ya se disponga de un objeto de la clase externa (o contenedora). Esto se debe a que el objeto de la clase interna se conecta de manera transparente al de la clase externa que lo haya creado. (Esto resuelve también las cuestiones relativas a los ámbitos de los nombres en la clase interna)
Las clases normales (no internas) no pueden ser privadas o protegidas (solo pueden tener acceso público o de paquete). Las clases internas pueden tener cualquiera de los cuatro tipos de acceso. Esto permite ocultar las implementaciones de las clases internas y evitar las dependencias de la codificación de tipos. Main02.java: Por defecto los métodos de una interface son públicos, a través de la implementación (de dicha interface) de una clase interna privada (o protegida) los mismos pueden ser no visibles y no estar disponibles.
Ver ejemplo: Main02.java

Clases internas locales

Las clases internas pueden crearse dentro de un método o incluso dentro de un ámbito arbitrario. Estas clases (definidas dentro de métodos) se denominan clases internas locales. Main03.java: Las clases definidas dentro de bloques if – else, se compilan con todo el resto del código. Sin embargo estas clases no están disponibles fuera del ámbito en el que se definen, por lo demás se asemejan a clases normales.
Ver ejemplo: Main03.java

Clases internas anónimas

Una clase interna anónima, es una clase que no tiene nombre. Generalmente se utilizan para implementar una interface (o extender de otra clase) y devolverse a través de un método. Es decir, se crean solo con el objetivo de darle una implementación a una interface. Este tipo de clases están en cierta forma limitadas si se comparan con el mecanismo normal de herencia, porque pueden extender una clase o implementar solo una interface, pero no pueden hacer ambas cosas al mismo tiempo.
Luego de definir una clase interna anónima se cierra la expresión con un punto y coma. Si se está definiendo una clase interna anónima y se quiere usar un objeto que este definido fuera de la clase interna anónima, el compilador requiere que la referencia al argumento sea FINAL. Si esto no se hace el compilador generará un mensaje de error.
Ver ejemplo: Main04.java

Clases anidadas (Clases internas estáticas)

Una clase anidada es una clase interna estática. Este tipo de clases internas son útiles cuando no es necesario disponer de una conexión entre el objeto de la clase interna y el objeto de la clase externa. No se puede acceder a un objeto no estático de la clase externa desde un objeto de una clase anidada (debido a que no existe una conexión con la clase externa).
A diferencia de las clases internas normales que no pueden tener miembros estáticos o clases anidadas, las clases anidadas si pueden contener estos elementos.
Ver ejemplo: Main05.java

1 comentarios:

Manolo dijo...


Gracias!
Me ha sido de mucha utilidad tu post :D



Publicar un comentario

Este blog dejo de ser mantenido el día 12/02/2010. Para cualquier consulta o comentario realizarlo a través del sitio http://onj2ee.blogspot.com/