Vous êtes sur la page 1sur 3

CLASES INTERNAS

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.

Las clases internas pueden acceder directamente a todos los miembros


de la clase contenedora. Y ello es independiente de los modificadores de
control de acceso que tengan los miembros de modo que, por ejemplo, puede
utilizar directamente una variable miembro aunque esté declarada como
privada.

Las clases internas no estáticas tienen algunas limitaciones: los nombres de


los miembros de la clase contenedora tienen que ser diferentes de los de
la clase interna, una clase interna no puede contener ningún miembro
estático y no es posible crear un objeto de la clase interna sin tener 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.

public class Alumno {

private String nombre;


private String apellidos;
private int anyoNacimiento;
private Direccion direccion;

public Alumno(String nombre, String apellidos, int anyoNacimiento,


Direccion direccion) {
this.nombre = nombre;
this.apellidos = apellidos;
this.anyoNacimiento = anyoNacimiento;
this.direccion = direccion;
}

public String getNombre() {


return nombre;
}

public void setNombre(String nombre) {


this.nombre = nombre;
}

public String getApellidos() {


return apellidos;
}

public void setApellidos(String apellidos) {


this.apellidos = apellidos;
}

public int getAnyoNacimiento() {


return anyoNacimiento;
}

public void setAnyoNacimiento(int anyoNacimiento) {


this.anyoNacimiento = anyoNacimiento;
}

public Direccion getDireccion() {


return direccion;
}

public void setDireccion(Direccion direccion) {


this.direccion = direccion;
}

@Override
public String toString() {
return “Alumno [nombre=” + nombre + “, apellidos=” + apellidos + “,
anyoNacimiento=” + anyoNacimiento
+ “, direccion=” + direccion + “]”;
}
class Direccion {
String calle;
int numero;

public Direccion(String calle, int numero) {


this.calle = calle;
this.numero = 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.

Vous aimerez peut-être aussi