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 } } } - Se declaran con la palabra clave
-
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); } } } - Se declaran sin la palabra clave
-
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) |