Clases anidadas estáticas - 1

"Entonces, el tema número dos son las clases anidadas estáticas. Recuerde que las clases anidadas no estáticas se denominan clases internas .

"Vamos a entender qué significa la palabra estática en el contexto de una declaración de clase anidada. ¿Qué piensas?"

"Si una variable se declara como estática, entonces solo existe una copia de la variable. Entonces, si una clase anidada es estática, ¿eso significa que solo puede crear un objeto de esa clase?"

"No deje que la palabra estática lo confunda aquí. Es cierto que si una variable se declara como estática, entonces solo hay una copia de la variable. Pero una clase anidada estática es más como un método estático en este sentido. El La palabra estática antes de la declaración de clase indica que la clase no almacena referencias a objetos de su clase externa".

"Ah. Los métodos normales almacenan implícitamente una referencia de objeto, pero los métodos estáticos no. Es lo mismo con las clases estáticas, ¿verdad, Ellie?"

"Absolutamente. Su rápida comprensión es encomiable. Las clases anidadas estáticas no tienen referencias ocultas a objetos de su clase externa".

class Zoo
{
 private static int count = 7;
 private int mouseCount = 1;

 public static int getAnimalCount()
 {
  return count;
 }

 public int getMouseCount()
 {
  return mouseCount;
 }

 public static class Mouse
 {
  public Mouse()
  {
  }
   public int getTotalCount()
  {
   return count + mouseCount; // Compilation error.
  }
 }
}

"Revisemos este ejemplo cuidadosamente".

"¿A qué variables puede acceder el método estático getAnimalCount?"

"Solo los estáticos. Porque es un método estático".

"¿A qué variables puede acceder el método getMouseCount?"

"Tanto los estáticos como los no estáticos. Tiene una referencia oculta (este) a un objeto Zoo".

"Así es. Entonces, la clase Mouse anidada estática, como un método estático, puede acceder a las variables estáticas de la clase Zoo, pero no puede acceder a las no estáticas".

"Podemos crear objetos Mouse de manera segura, incluso si no se ha creado un solo objeto Zoo. Así es como puede hacerlo:"

class Home
{
 public static void main(String[] args)
 {
  Zoo.Mouse mouse = new Zoo.Mouse();
 }
}

"La clase Mouse es en realidad una clase muy común. El hecho de que se declare dentro de la clase Zoo le da dos características especiales".

1) Al crear objetos de una clase anidada (como la clase Mouse) fuera de la clase externa, también debe usar el operador de punto para especificar el nombre de la clase externa.

"Así, por ejemplo: Zoo.Mouse".

2) La clase Zoo.Mouse y sus objetos tienen acceso a las variables y métodos estáticos privados de la clase Zoo (dado que la clase Mouse también se declara dentro de la clase Zoo).

"Es todo por hoy."

"¿Así que solo un nombre adicional y eso es todo?"

"Sí."

"Eso es incluso más fácil de lo que parecía al principio".