Entendiendo las clases anidadas estáticas en Java: Uso, diferencias y ejemplos
Clase anidada estática en Java
Descubre cómo funcionan las clases anidadas estáticas de Java, cómo difieren de las clases internas y cuándo usarlas con ejemplos de código prácticos.
En Java, una clase puede definirse dentro de otra clase. Estas se llaman clases anidadas y vienen en dos formas:
- Clases anidadas no‑estáticas (clases internas)
- Clases anidadas estáticas
Mientras que las clases internas se cubrieron en nuestro tutorial previo, este artículo se enfoca en las clases anidadas estáticas.
Clase anidada estática en Java
Para declarar una clase anidada como estática, simplemente antepón la palabra clave static:
class Animal { static class Mamifero { // miembros estáticos y no‑estáticos de Mamifero } // miembros de Animal }
Como cualquier clase, una clase anidada estática puede contener tanto miembros estáticos como de instancia.
Por ser un miembro estático de su clase externa, puedes acceder a una clase anidada estática sin crear una instancia de la clase externa.
Ejemplo: Clase anidada estática
class Animal { // clase interna class Reptil { public void mostrarInfo() { System.out.println("Soy un reptil."); } } // clase anidada estática static class Mamifero { public void mostrarInfo() { System.out.println("Soy un mamífero."); } } } class Main { public static void main(String[] args) { // crear instancia de clase externa Animal animal = new Animal(); // crear instancia de clase interna no‑estática Animal.Reptil reptil = animal.new Reptil(); reptil.mostrarInfo(); // crear instancia de clase anidada estática Animal.Mamifero mamifero = new Animal.Mamifero(); mamifero.mostrarInfo(); } }
Salida
Soy un reptil. Soy un mamífero.
En el código anterior, Mamifero es una clase anidada estática mientras que Reptil es una clase interna.
Observa la diferente sintaxis de instanciación:
- Clase interna no‑estática:
Animal.Reptil reptil = animal.new Reptil(); - Clase anidada estática:
Animal.Mamifero mamifero = new Animal.Mamifero();
Accediendo a miembros de la clase externa
Como una clase anidada estática está asociada con su clase externa, solo puede acceder a miembros estáticos de la clase externa. Intentos de referenciar miembros de instancia resultarán en error de compilación.
Ejemplo: Intentando llamar a un método no‑estático
class Animal { static class Mamifero { public void mostrarInfo() { System.out.println("Soy un mamífero."); } } class Reptil { public void mostrarInfo() { System.out.println("Soy un reptil."); } } public void comer() { System.out.println("Como comida."); } } class Main { public static void main(String[] args) { Animal animal = new Animal(); Animal.Reptil reptil = animal.new Reptil(); reptil.mostrarInfo(); Animal.Mamifero mamifero = new Animal.Mamifero(); mamifero.mostrarInfo(); mamifero.comer(); // ❌ Error en tiempo de compilación } }
Salida
Main.java:28: error: cannot find symbol mamifero.comer(); ^ symbol: method comer() location: variable mamifero of type Mamifero 1 error compiler exit status 1
El error ocurre porque mamifero es una instancia de una clase anidada estática y no puede invocar el método no‑estático comer() de Animal.
¿Clase de nivel superior estática?
Java prohíbe clases de nivel superior estáticas. Solo las clases anidadas pueden declararse static. El siguiente código demuestra el error del compilador:
static class Animal { public static void mostrarInfo() { System.out.println("Soy un animal"); } } class Main { public static void main(String[] args) { Animal.mostrarInfo(); } }
Salida
Main.java:1: error: modifier static not allowed here static class Animal { ^ 1 error compiler exit status 1
Esto confirma que solo las clases anidadas pueden ser static.
Java
- Palabra clave static en C#: Dominando variables, métodos y clases estáticas
- Entendiendo clases anidadas en C#: Definición, uso y herencia
- Palabra clave final en Java: Variables, métodos y clases
- Operador instanceof en Java: Guía completa
- Dominando clases anidadas e internas en Java: Tipos, ejemplos y mejores prácticas
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
- Dominando la Reflexión en Java: Inspeccionando clases, métodos y campos en tiempo de ejecución
- Dominando ObjectOutputStream de Java: Serialización, Métodos y Ejemplos Prácticos
- Dominando Java Generics: Construyendo Código Reutilizable y Type-Safe
- Dominando las operaciones de archivos en Java con java.io: creación, lectura, escritura y eliminación