Wewnętrzne klasy statyczne - 1

Tak więc tematem numer dwa są klasy zagnieżdżone.

Przed deklaracją klasy wewnętrznej możemy umieścić słowo kluczowe - static i wówczas klasa wewnętrzna zostanie zagnieżdżona.

Zobaczmy, co oznacza słowo static obok deklaracji klasy zagnieżdżonej. Jak myślisz?

- Jeśli zmienna jest zadeklarowana jako statyczna, to istnieje w jednej instancji, a jeśli klasa zagnieżdżona jest statyczna, to można utworzyć tylko jeden obiekt takiej klasy?

Nie daj się zwieść słowu „statyczny” . Jeśli zmienna jest zadeklarowana jako statyczna, to istnieje w jednej kopii - to prawda. Ale statyczna klasa zagnieżdżona pod tym względem bardziej przypomina metodę statyczną. Słowo static przed deklaracją klasy wskazuje, że klasa ta nie przechowuje odniesień do obiektów klasy zewnętrznej, w ramach której została zadeklarowana.

- Tak. Zwykłe metody potajemnie przechowują referencję do obiektu, ale metody statyczne tego nie robią. Tak samo jest z klasami statycznymi, mam rację Ellie?

- Absolutnie. Twoja pomysłowość jest godna pochwały. Zagnieżdżone klasy statyczne nie mają ukrytych odniesień do obiektów klasy zewnętrznej, w której zostały zadeklarowane.

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; //ошибка компиляции.
  }
 }
}

Przyjrzyjmy się dokładnie temu przykładowi.

Do jakich zmiennych można uzyskać dostęp za pomocą statycznej metody getAnimalCount?

— Tylko statyczne. To metoda statyczna.

Do jakich zmiennych można uzyskać dostęp za pomocą metody getMouseCount?

Zarówno statyczne, jak i niestatyczne. Potajemnie przechowuje odniesienie (to) do obiektu typu Zoo.

- Prawidłowy. Zatem statycznie zagnieżdżona klasa Mouse, podobnie jak metoda statyczna, może uzyskiwać dostęp do zmiennych statycznych klasy Zoo, ale nie może uzyskiwać dostępu do zmiennych niestatycznych.

Możemy bezpiecznie tworzyć obiekty Mouse, nawet jeśli nie ma utworzonych obiektów Zoo. Oto jak to zrobić:

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

W rzeczywistości klasa Mouse jest najczęściej spotykaną klasą. Ponieważ jest zadeklarowany w klasie Zoo, ma dwie funkcje.

1) Podczas tworzenia obiektów klasy zagnieżdżonej (np. klasy Mouse) poza zewnętrzną klasą nadrzędną należy również podać nazwę klasy zewnętrznej za pomocą kropki.

Na przykład: Zoo.Mysz.

2) Klasa Zoo.Mouse i jej obiekty mają dostęp do prywatnych zmiennych statycznych i metod klasy Zoo (klasa Mouse jest również zadeklarowana wewnątrz klasy Zoo).

To wszystko na dzisiaj.

- Tj. tylko dodatkowa nazwa i tyle?

Tak.

„To nawet łatwiejsze, niż się wydawało na pierwszy rzut oka.