Académique Documents
Professionnel Documents
Culture Documents
Una clase interna es una clase cuya definición está dentro de otra
clase. Una clase exterior se denomina clase externa o clase contenedora. Las
clases internas permiten evitar la proliferación de clases muy pequeñas que en
muchos casos sólo se usan dentro de uns sola clase. El uso más común es la
creación de adaptadores y manejadores de eventos, como intentaré explicar
más adelante, así como en la implementación de interfaces (que también las
explicaré) tipo Iterator.
Hay distintos tipos de clases internas pero, por simplicidad, sólo explicaré las
clases internas que se definen como miembros normales no estáticos de una
clase contenedora. Como son miembros de la clase contenedora, sólo puede
existir un objeto de la clase interna cuando exista un objeto de la clase
contenedora.
Para entender un poco mejor todo ésto, un ejemplo, en el que se añade una
clase interna a la clase Alumno, para poder tener los datos sobre la dirección
del alumno. He simplificado la dirección con solo dos atributos (calle y número).
He añadido el método toString() tanto en Alumno como en Dirección, que
devuelve el contenido del objeto en forma de cadena y permite la escritura
directa por pantalla de un objeto.
@Override
public String toString() {
return “Alumno [nombre=” + nombre + “, apellidos=” + apellidos + “,
anyoNacimiento=” + anyoNacimiento
+ “, direccion=” + direccion + “]”;
}
class Direccion {
String calle;
int numero;
@Override
public String toString() {
return “Direccion [calle=” + calle + “, numero=” + numero + “]”;
}
Con las clases internas se produce una nueva sintaxis en el nombre de las
clases, en el operador new, y en la autorreferencia this. Como habrás visto en
el ejemplo, si se quiere utilizar directamente la clase interna para crear un
nuevo objeto, hay que
hacerlo: NombreClaseContenedora.NombreClaseInterna. Si la clase interna
no se ha declarado privada se puede crear un objeto de esa clase interna
mediante referenciaObjetoClaseContenedora.new NombreClaseInterna(). Y
si dentro de la clase interna se desea hacer una referencia al objeto actual de
la clase contenedora se hace mediante NombreClaseContenedora.this.