English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tutoriales básicos de Java

Control de flujo Java

Java array

Java orientado a objetos (I)

Java orientado a objetos (II)

Java orientado a objetos (III)

Manejo de excepciones en Java

Java lista (lista)

Java cola (cola)

Java conjuntos Map

Java conjuntos Set

Java entrada/salida (I/O)

Reader de Java/Writer

Otras temas de Java

Clase estática anidada de Java

En este tutorial, aprenderás sobre las clases estáticas anidadas con ejemplos. También conocerás la diferencia entre las clases estáticas y las internas.

Como se explicó en el tutorial anterior, podemos tener una clase dentro de otra clase en Java. Esta clase se llama clase anidada. En Java, las clases anidadas tienen dos tipos:

  • Clase no estática anidada (clase interna)

  • clase estática anidada.

En el tutorial anterior, ya discutimos sobre las clases internas. Si quieres saber más sobre las clases internas, visitaClase anidada de Java.

En este tutorial, aprenderemos sobre las clases estáticas anidadas.

Clase estática anidada de Java

Usamos la palabra clave static para hacer que nuestras clases anidadas sean estáticas.

Nota:En Java, solo se permite que las clases anidadas sean estáticas.

Al igual que las clases convencionales, las clases anidadas pueden contener tanto campos estáticos como no estáticos y métodos. Por ejemplo,

Clase Animal {
   static class Mammal {
      // Miembros estáticos y no estáticos de la clase Mammal
   }
   // Miembro de la clase Animal
}

La clase anidada estática está asociada con la clase externa.

No necesitamos un objeto de la clase externa para acceder a la clase anidada estática.

Ejemplo: clase anidada estática

class Animal {
  //Clase interna
   class Reptile {
      public void displayInfo() {
        System.out.println("Soy un reptil.");
      }
   }
  //Clase estática
   static class Mammal {
      public void displayInfo() {
        System.out.println("Soy un mamífero.");
      }
   }
}
class Main {
   public static void main(String[] args) {
      //Creación de objetos de la clase externa
      Animal animal = new Animal();
      //Creación de objetos de clase no estática
      Animal.Reptile reptile = animal.new Reptile();
      reptile.displayInfo();
      //Creación de objetos de clase anidada estática
      Animal.Mammal mammal = new Animal.Mammal();
      mammal.displayInfo();
   }
}

Resultado de la salida

Soy un reptil.
Soy un mamífero.

En el programa anterior, tenemos dos clases anidadas Mammal y Reptile dentro de la clase Animal.

Para crear un objeto de la clase no estática Reptile, usamos

Animal.Reptile reptile = animal.new Reptile()

Para crear un objeto de la clase estática Mammal, usamos

Animal.Mammal mammal = new Animal.Mammal()

Acceso a miembros de la clase externa

En Java, las clases anidadas estáticas están asociadas con la clase externa. Por eso las clases anidadas estáticas solo pueden acceder a los miembros de la clase externa (campos y métodos estáticos).

Veamos qué ocurre si intentamos acceder a los campos y métodos no estáticos de una clase externa.

Ejemplo: acceso a miembros no estáticos

class Animal {
  static class Mammal {
   public void displayInfo() {
     System.out.println("Soy un mamífero.");
   }
 }
 class Reptile {
   public void displayInfo() {
     System.out.println("Soy un reptil.");
   }
 }
 public void eat() {
   System.out.println("Yo como comida.");
 }
}
class Main {
 public static void main(String[] args) {
   Animal animal = new Animal();
   Animal.Reptile reptile = animal.new Reptile();
   reptile.displayInfo();
   Animal.Mammal mammal = new Animal.Mammal();
   mammal.displayInfo();
   mammal.eat();
 }
}

Resultado de la salida

Main.java:28: error: no se puede encontrar el símbolo
    mammal.eat();
          ^
  symbol: método eat()
  location: variable mammal de tipo Mammal
1 error
estado de salida del compilador 1

En el ejemplo anterior, creamos un método no estático eat() en la clase Animal.

Ahora, si intentamos acceder a eat() usando el objeto mammal, el compilador mostrará un error.
Esto se debe a que mammal es un objeto de clase estática, por lo que no podemos acceder a métodos no estáticos desde la clase estática.

Clase de nivel superior estática

Como se mencionó anteriormente, solo las clases anidadas pueden ser estáticas. No podemos tener clases de nivel superior estáticas.

Veamos qué sucede si intentamos hacer que una clase de nivel superior sea estática.

static class Animal {
 public static void displayInfo() {
   System.out.println("Soy un animal");
 }
}
class Main {
 public static void main(String[] args) {
   Animal.displayInfo();
 }
}

Resultado de la salida

Main.java:1: error: el modificador static no está permitido aquí
static class Animal {
       ^
1 error
estado de salida del compilador 1

En el ejemplo anterior, intentamos crear una clase estática Animal. Debido a que Java no permite el uso de clases estáticas de nivel superior, se producirá un error.