Las clases internas en Java fueron introducidas desde la versión 1.1, desde entonces han sufrido grandes criticas, tanto positivas como negativas. Lo cierto es que son bastante útiles en ciertas ocasiones además de necesarias para entender el código de algunas aplicaciones interesantes.
Codificar un clase interna “Regular”::
Llamamos regular a aquella clase que no es:
1. Estática.
2. Método local.
3. Anónima.
class MiClaseExterna{
class MiClaseInterna{ }
}
Al compilar dicha clase obtendremos 2 archivos de clase:
* MiClaseExterna.class
* MiClaseExterna$MiClaseInterna.class
c:> java MiClaseExterna$MiClaseInterna
¿Cómo utilizamos una clase interna?. Simple, pasemos al código.
public class ClaseExterna {
private int x = 7;
//Definición de una clase interna
class MiClaseInterna{
public void verClaseExterna(){
System.out.println(“El valor de X de la ClaseExterna es: “+ x);
}
}
public void crearInterna(){
//Crear una instancia de la clase interna
MiClaseInterna mci = new MiClaseInterna();
mci.verClaseExterna();
}
public static void main(String[] args)
{
ClaseExterna ce = new ClaseExterna();
ce.crearInterna(); //Llamamos al método que crea la clase interna
}
}
Crear un objeto de una clase interna fuera del código de instancia de la clase externa::
public class ClasesInternas {
public static void main (String[] args)
{
ClaseExterna ce = new ClaseExterna();
ClaseExterna.MiClaseInterna mci = ce.new MiClaseInterna();
mci.verClaseExterna();
}
}
o en una línea…
public static void main(String[] args)
{
ClaseExterna.MiClaseInterna mci = new ClaseExterna().new MiClaseInterna();
mci.verClaseExterna();
}
Referenciar una instancia de una clase interna o externa dentro de una clase interna::
public void miMetodo(){
MiClase mc = new MiClase();
mc.hacerAlgo(this); //se pasa como parámetro el objeto actual.
}
public class ClaseExterna {
private int x = 7;
//Definición de una clase interna
class MiClaseInterna{
public void verClaseExterna(){
System.out.println(“El valor de X de la ClaseExterna es: “+ x);
System.out.println(“La referencia a la clase interna: “+ this);
System.out.println(“La referencia a la clase externa: “+ ClaseExterna.this);
}
}
public void crearInterna(){
//Crear una instancia de la clase interna
MiClaseInterna mci = new MiClaseInterna();
mci.verClaseExterna();
}
public static void main(String[] args)
{
ClaseExterna.MiClaseInterna mci = new ClaseExterna().new MiClaseInterna();
mci.verClaseExterna();
}
}
El resultado al ejecutar el código anterior es:
El valor de X de la ClaseExterna es: 7
La referencia a la clase interna: ClaseExterna$MiClaseInterna@112f614
La referencia a la clase externa: ClaseExterna@1d9dc39
Así que:
+ Para referenciar una clase interna dentro de la clase interna se utiliza this.
+ Para referenciar una clase externa dentro de la clase interna se utiliza NombreDeLaClaseExterna.this
+ final
+ abstract
+ public
+ private
+ protected
+ static (lo que la volvería una clase anidada estática, no una clase interna)
+ strictfp