Sobes.tech
Middle

¿Qué tipos de clases anidadas existen?

sobes.tech AI

Respuesta de la IA

Clases internas estáticas y clases internas (clases internas no estáticas).

  • Clases internas estáticas:

    • Se declaran con la palabra clave static.
    • Solo tienen acceso a los miembros estáticos (campos y métodos) de la clase externa, incluidos los privados.
    • No tienen acceso directo a los miembros no estáticos de la clase externa.
    • Pueden ser instanciadas sin una instancia de la clase externa.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        static class StaticNested {
            void display() {
                System.out.println("Var estática: " + staticVar);
                // System.out.println("Var de instancia: " + instanceVar); // Error de compilación
            }
        }
    }
    
  • Clases internas (clases internas no estáticas):

    • Se declaran sin la palabra clave static.
    • Tienen acceso completo a todos los miembros (estáticos y no estáticos) de la clase externa, incluidos los privados.
    • No pueden contener miembros estáticos (campos o métodos), excepto constantes finales.
    • Requieren una instancia de la clase externa para su creación.
    class Outer {
        private static int staticVar = 10;
        private int instanceVar = 20;
    
        class Inner {
            void display() {
                System.out.println("Var estática: " + staticVar);
                System.out.println("Var de instancia: " + instanceVar);
            }
        }
    }
    
  • Clases locales:

    • Se declaran dentro de métodos, constructores o bloques de inicialización.
    • Tienen acceso a todas las variables locales finales y efectivamente finales, así como a los miembros de la clase externa en la que se definen.
    • Su ámbito de visibilidad está limitado al bloque en el que se declaran.
    class Outer {
        void myMethod() {
            final int localVar = 5; // Efectivamente final
    
            class LocalInner {
                void display() {
                    System.out.println("Var local: " + localVar);
                }
            }
    
            LocalInner local = new LocalInner();
            local.display();
        }
    }
    
  • Clases anónimas:

    • Clases locales sin nombre.
    • Se crean e instancian simultáneamente.
    • Se usan a menudo para crear implementaciones de interfaces o extender clases.
    interface MyInterface {
        void doSomething();
    }
    
    class Outer {
        void myMethod() {
            MyInterface anon = new MyInterface() {
                @Override
                public void doSomething() {
                    System.out.println("Haciendo algo anónimamente.");
                }
            };
            anon.doSomething();
        }
    }
    

Diferencias principales entre clases internas estáticas y clases internas:

Característica Clase interna estática Clase interna
Palabra clave static Ausente
Acceso a miembros Solo miembros estáticos de la Todos los miembros de la clase
clase externa externa
Creación de instancia Sin una instancia de la clase externa Requiere una instancia de la clase externa
Miembros estáticos Pueden contener No pueden contener (excepto constantes)