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(); } }