¿Qué tipos de clases anidadas existen en el lenguaje de programación?
sobes.tech AI
Respuesta de la IA
Clases anidadas en Java:
-
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 } } } -
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-privateopublic.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); } } } -
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
finalo efectivamentefinal, 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(); } } -
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). | Sí | 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. |
Sí | 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. |
Sí | No |