Sobes.tech
Middle

¿Qué tipos de clases anidadas existen en el lenguaje de programación?

sobes.tech AI

Respuesta de la IA

Clases anidadas en Java:

  1. Clases anidadas estáticas (Static Nested Classes): Se comportan como miembros estáticos normales de la clase. No tienen acceso a los miembros no estáticos de la clase externa. Se crean sin una instancia de la clase externa.

    public class Outer {
        private static String staticMsg = "Mensaje estático";
        private String instanceMsg = "Mensaje de instancia";
    
        static class StaticNested {
            void displayStatic() {
                // Acceso a los miembros estáticos de la clase externa
                System.out.println(staticMsg);
                // No hay acceso a los miembros no estáticos de la clase externa
                // System.out.println(instanceMsg); // Error de compilación
            }
        }
    }
    
  2. Clases internas (Inner Classes): Están relacionadas con una instancia de la clase externa. Tienen acceso completo a todos los miembros (estáticos y no estáticos) de la clase externa, incluyendo los privados. Pueden ser declaradas como private, protected, package-private o public.

    public class Outer {
        private static String staticMsg = "Mensaje estático";
        private String instanceMsg = "Mensaje de instancia";
    
        class Inner {
            void display() {
                // Acceso a los miembros estáticos y no estáticos de la clase externa
                System.out.println(staticMsg);
                System.out.println(instanceMsg);
            }
        }
    }
    
  3. Clases locales (Local Classes): Se declaran dentro de un bloque (método, constructor o inicializador estático). Solo están disponibles dentro de ese bloque. Pueden acceder a variables locales y parámetros del bloque que sean final o efectivamente final, así como a todos los miembros de la clase externa.

    public class Outer {
        private String instanceMsg = "Mensaje de instancia";
    
        void methodWithLocalClass() {
            final String localVar = "Variable local"; // o efectivamente final
    
            class Local {
                void display() {
                    System.out.println(instanceMsg);
                    System.out.println(localVar);
                }
            }
    
            Local localObj = new Local();
            localObj.display();
        }
    }
    
  4. Clases anónimas (Anonymous Classes): Son clases locales sin nombre. Se usan para declarar y crear una instancia de una clase al mismo tiempo, que implementa una interfaz o extiende una clase. Son útiles para crear objetos pequeños y de uso único.

    public class Outer {
        void methodWithAnonymousClass() {
            // Clase anónima que implementa la interfaz Runnable
            Runnable myRunnable = new Runnable() {
                @Override
                public void run() {
                    System.out.println("Ejecutando desde clase anónima");
                }
            };
            new Thread(myRunnable).start();
    
            // Clase anónima que extiende la clase Thread
            Thread myThread = new Thread() {
                @Override
                public void run() {
                    System.out.println("Ejecutando desde clase anónima que extiende Thread");
                }
            };
            myThread.start();
        }
    }
    

Comparación de tipos de clases anidadas:

Tipo de clase Lugar de declaración Acceso a los miembros de la clase externa ¿Se necesita una instancia de la clase externa para crearla? Modificadores de acceso
Clase anidada estática Dentro de la clase, con la palabra clave static. Solo a los estáticos. No Todos
Clase interna Dentro de la clase (no estática). A todos (estáticos y no estáticos). Todos
Clase local Dentro de un bloque (métodos, constructores, inicializadores). A todos los miembros de la clase externa + variables locales final o efectivamente final. No (final o abstract implícito)
Clase anónima Dentro de un bloque (expresión). A todos los miembros de la clase externa + variables locales final o efectivamente final. No