Sobes.tech
Junior

¿Qué son las clases anidadas?

sobes.tech AI

Respuesta de la IA

Las clases anidadas (nested classes) son clases declaradas dentro de otra clase. Pueden ser estáticas (static nested classes) o no estáticas (inner classes).

Clases anidadas estáticas:

  • Se declaran con el modificador static.
  • No tienen acceso directo a los miembros no estáticos de la clase externa (solo a través de una instancia de la clase externa).
  • Pueden contener miembros estáticos y no estáticos.
  • Se crean sin una instancia de la clase externa.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public static class StaticNested {
        // Tiene acceso a staticOuterVar
        public void printStaticValue() {
            System.out.println(staticOuterVar);
        }

        // No tiene acceso directo a instanceOuterVar
        // public void printInstanceValue() {
        //     System.out.println(instanceOuterVar); // Error de compilación
        // }
    }
}

Uso de la clase anidada estática:

// Ejemplo de creación de una instancia de la clase anidada estática
Outer.StaticNested nestedObject = new Outer.StaticNested();
nestedObject.printStaticValue(); // Imprime 10

Clases internas (inner classes):

  • No se declaran con static.
  • Tienen acceso completo a todos los miembros de la clase externa, incluyendo los privados.
  • No pueden contener miembros estáticos (excepto constantes en tiempo de compilación).
  • Requieren una instancia de la clase externa para su creación.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public class Inner {
        // Tiene acceso a staticOuterVar y instanceOuterVar
        public void printValues() {
            System.out.println(staticOuterVar); // Disponible
            System.out.println(instanceOuterVar); // Disponible
        }
    }
}

Uso de la clase interna no estática:

// Ejemplo de creación de una instancia de la clase interna no estática
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new Inner();
innerObject.printValues(); // Imprime 10 y 20

Ventajas del uso de clases anidadas:

  1. Agrupación lógica: Las clases que solo son usadas por otra clase pueden agruparse lógicamente dentro de ella.
  2. Encapsulación: Las clases anidadas tienen acceso a los miembros privados de la clase externa.
  3. Legibilidad y mantenibilidad: El código se vuelve más ordenado.

Tipos de clases internas no estáticas:

  • Clases locales: Declaradas dentro de un método.
  • Clases anónimas: Clases sin un nombre explícito, generalmente usadas para crear instancias de clases abstractas, interfaces o clases base con métodos sobrescritos.

Clase local:

public class Outer {
    public void myMethod() {
        class LocalClass {
            void display() {
                System.out.println("Dentro de la clase local");
            }
        }
        LocalClass local = new LocalClass();
        local.display();
    }
}

Clase anónima (ejemplo con interfaz):

interface Greeting {
    void sayHello();
}

public class Outer {
    public void greet() {
        Greeting anonymousGreeting = new Greeting() {
            @Override
            public void sayHello() {
                System.out.println("¡Hola desde la clase anónima!");
            }
        };
        anonymousGreeting.sayHello();
    }
}