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:
- Agrupación lógica: Las clases que solo son usadas por otra clase pueden agruparse lógicamente dentro de ella.
- Encapsulación: Las clases anidadas tienen acceso a los miembros privados de la clase externa.
- 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();
}
}