Sobes.tech
Middle

¿Cuáles son las diferencias entre clases anidadas (nested) y clases internas (inner) en Java?

sobes.tech AI

Respuesta de la IA

  • Clases anidadas (Nested classes): Miembros estáticos de la clase externa. No tienen acceso directo a los miembros no estáticos (campos y métodos) de la clase externa, solo a través de una instancia de la clase externa. Se declaran con la palabra clave static.

  • Clases internas (Inner classes): Miembros no estáticos de la clase externa. Tienen acceso completo a todos los miembros (estáticos y no estáticos) de la clase externa, incluyendo los privados. Para crear una instancia de una clase interna, se necesita una instancia de la clase externa. No usan la palabra clave static.

Ejemplo:

// Clase externa
class Outer {
    private int outerField = 10;
    private static int staticOuterField = 20;

    // Clase anidada estática
    static class StaticNestedClass {
        void display() {
            // Acceso solo a miembros estáticos de la clase externa
            System.out.println("Nested estático: " + staticOuterField);
            // No hay acceso directo a outerField
            // System.out.println(outerField); // Error de compilación
        }
    }

    // Clase interna no estática
    class InnerClass {
        void display() {
            // Acceso a todos los miembros de la clase externa
            System.out.println("Interna: " + outerField);
            System.out.println("Interna (estática): " + staticOuterField);
        }
    }
}

// Uso
public class Main {
    public static void main(String[] args) {
        // Crear instancia de clase anidada estática
        Outer.StaticNestedClass staticNested = new Outer.StaticNestedClass();
        staticNested.display();

        // Crear instancia de clase interna requiere una instancia de la clase externa
        Outer outer = new Outer();
        Outer.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}
Característica Clase anidada (Nested Class) Clase interna (Inner Class)
Palabra clave static No
Acceso a miembros de la clase externa Solo estáticos Todos
Requiere instancia de la clase externa para crear una instancia No
Conexión con la instancia de la clase externa No