Este es un concepto polémico en Java.
Básicamente, después de estudiarlo, he llegado a las siguientes conclusiones:
1) Una inner class es una clase íntima con su clase outer.
2) Una inner class puede definir sus propias variables y acceder a las variables de outer.
3) Desde la clase outer, se puede instanciar inner classes y usarlas.
A continuación, introducimos un ejemplo descriptivo de inner clases. Básicamente, vemos que tenemos un array con datos y estos son recorridos mediante un iterador interno, que va recorriendo de dos en dos las posiciones e imprimiendo la información.
Un cordial saludo y suerte,
Jaime.
/**
* Ejemplo de creacion de una outer class e inner class
* Esto es DataStructure es outer class, y después
* el método printEven, se apoya en una clase interna, llamada InnerEvenIterator,
* que básicamente accede a los datos de DataStructure y mediante una variable
* iterador interna los va recorriendo de dos en dos e imprimiéndolos.
* @author jaime
* Fuente: Oracle
*
*/
/**
* INNER CLASSES
* Atributos: SIZE definido como final, array de ints.
*
*/
public class DataStructure {
//create an array
private final static int SIZE = 15;
private int[] arrayOfInts = new int[SIZE];
/**
* Constructor: acceso sin problema a las variables.
*/
public DataStructure() {
//fill the array with ascending integer values
for (int i = 0; i < SIZE; i++) {
arrayOfInts[i] = i;
}
}
/**
* PrintEven, creamos un InnerEventIterator (clase interna, que tiene íntima relación
* con nuestra clase) y vamos recorriendo e imprimiendo los valores pares del array.
*/
public void printEven() {
//print out values of even indices of the array
InnerEvenIterator iterator = this.new InnerEvenIterator();
while (iterator.hasNext()) {
System.out.println(iterator.getNext() + " ");
}
}
/**
* Clase interna.
* InnerEventIterator: tiene un atributo next y después dos métodos internos, que pueden acceder
* a arrayOfInts (atributo interno de DataStructure.
* @author jaime
*/
private class InnerEvenIterator {
//Contador, que empieza en la posición 0
private int next = 0;
public boolean hasNext() {
//Comprueba si el elemento actual es el último dentro del array
return (next <= SIZE - 1);
}
public int getNext() {
//Registra un valor dentro del índice par del array.
int retValue = arrayOfInts[next];
//Obtiene el siguiente elemento y lo devuelve
next += 2;
return retValue;
}
}
/**
* Método main de prueba
* @param s
*/
public static void main(String s[]) {
//Cremos un objeto y llamamos al método printEvent, que hemos visto que creará
//una clase inner interna para gestionar el método
DataStructure ds = new DataStructure();
ds.printEven();
}
}