Classes aninhadas estáticas - 1

"Portanto, o tópico número dois são classes aninhadas estáticas. Lembre-se de que classes aninhadas não estáticas são chamadas de classes internas .

"Vamos entender o que a palavra static significa no contexto de uma declaração de classe aninhada. O que você acha?"

"Se uma variável é declarada como estática, então existe apenas uma cópia da variável. Portanto, se uma classe aninhada é estática, isso significa que você só pode criar um objeto dessa classe?"

"Não deixe a palavra estática confundir você aqui. É verdade que se uma variável é declarada como estática, então há apenas uma cópia da variável. Mas uma classe aninhada estática é mais como um método estático a esse respeito. A palavra static antes da declaração da classe indica que a classe não armazena referências a objetos de sua classe externa."

"Ah. Métodos normais armazenam implicitamente uma referência de objeto, mas métodos estáticos não. É o mesmo com classes estáticas, estou certo, Ellie?"

"Absolutamente. Sua compreensão rápida é louvável. Classes aninhadas estáticas não têm referências ocultas a objetos de sua classe 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.
  }
 }
}

"Vamos rever este exemplo com cuidado."

"Quais variáveis ​​o método estático getAnimalCount pode acessar?"

"Só os estáticos. Porque é um método estático."

"Quais variáveis ​​o método getMouseCount pode acessar?"

"Tanto os estáticos quanto os não estáticos. Tem uma referência oculta (this) para um objeto Zoo."

"Isso mesmo. Portanto, a classe Mouse aninhada estática, como um método estático, pode acessar as variáveis ​​estáticas da classe Zoo, mas não pode acessar as não estáticas."

"Podemos criar objetos Mouse com segurança, mesmo que nenhum objeto Zoo tenha sido criado. Veja como você pode fazer isso:"

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

"A classe Mouse é, na verdade, uma classe muito comum. O fato de ser declarada dentro da classe Zoo confere a ela dois recursos especiais."

1) Ao criar objetos de uma classe aninhada (como a classe Mouse) fora da classe externa, você também deve usar o operador ponto para especificar o nome da classe externa.

"Assim, por exemplo: Zoo.Mouse."

2) A classe Zoo.Mouse e seus objetos têm acesso às variáveis ​​e métodos estáticos privados da classe Zoo (uma vez que a classe Mouse também é declarada dentro da classe Zoo).

"Por hoje é isso."

"Então, apenas um nome adicional e é isso?"

"Sim."

"Isso é ainda mais fácil do que parecia a princípio."