A continuación dejo el resumen del octavo capítulo (Inner Classes) del libro "Sun Certified Programmer for Java 6 Study Guide".
En el siguiente post, hay una explicación introductoria (con ejemplos de código) para el tema clases internas. Se recomienda ver este post antes de leer el siguiente resumen.
Clases internas:
En el siguiente post, hay una explicación introductoria (con ejemplos de código) para el tema clases internas. Se recomienda ver este post antes de leer el siguiente resumen.
Clases internas:
- Una clase interna “regular” se declara dentro de las llaves de otra clase, pero fuera de cualquier método u otro bloque de código.
- Una clase interna puede poseer cualquier modificador.
- Una instancia de una clase interna comparte una relación especial con una instancia de la clase externa. Esta relación brinda a la clase interna acceso a todos los miembros de la clase externa, incluidos los que son privados.
- Para instanciar una clase interna, se debe poseer una referencia de la clase externa.
- Dentro de la clase externa, se puede instanciar la clase interna de la siguiente manera: MyInner mi = new MyInner();
- Para el código fuera de la clase externa, se puede instanciar la clase interna solo utilizando ambos nombres (de la clase externa e interna):
MyOuter mo = new MyOuter();
MyOuter.MyInner mi = mo.new MyOuter(); - Para el código dentro de una clase interna, la palabra clave this guarda una referencia a la instancia de la clase interna. Para hacer referencia a la instancia de la clase externa, se debe utilizar la siguiente sintaxis: MyOuter.this;
Clases internas locales:
- Una clase interna local es definida dentro de un método de la clase externa.
- Una clase interna local no puede utilizar variables declaradas dentro del método (incluyendo parámetros) salvo que esas variables sean finales.
- Los únicos modificadores que aplican a una clase interna local son abstract y final.
Clases internas anónimas:
- Una clase interna anónima no tiene nombre, y debe ser una subclase o una implementación de una interface.
- Una clase interna anónima siempre se crea como parte de una declaración, no se debe olvidar cerrar la declaración después de la definición de la clase. Esta es una sintaxis rara de Java una llave seguida de un punto y coma.
- A causa del polimorfismo, los únicos métodos que se pueden invocar de una clase interna anónima son los métodos pertenecientes al supertipo o interface que implementa.
- Una clase interna anónima puede extender de una clase o implementar solo una interface.
Clases anidadas (clases internas estáticas):
- Las clases anidadas son clases internas marcadas con el identificador static.
- Una clase anidada no es una clase interna, es una clase común dentro de otra.
- Como la clase anidada es estática, esta no comparte ninguna relación con la instancia de la clase externa. De hecho, no se necesita una instancia de la clase externa para instanciar una clase anidada.
- Para instanciar una clase anidada se necesitan utilizar ambos nombres de las clases (la externa y la anidada):
BigOuter.Nested n = new BigOuter.Nested(); - Una clase anidada no puede acceder a los miembros no estáticos de la clase externa, ya que no posee una referencia implícita a ella.
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
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





