Zagnieżdżona klasa statyczna Java

W tym samouczku nauczysz się zagnieżdżonych klas statycznych na podstawie przykładów. Dowiesz się również, czym różnią się klasy statyczne od klas wewnętrznych.

Jak dowiedzieliśmy się z poprzednich samouczków, możemy mieć klasę wewnątrz innej klasy w Javie. Takie klasy są znane jako klasy zagnieżdżone. W Javie klasy zagnieżdżone są dwojakiego rodzaju:

  • Zagnieżdżona klasa niestatyczna (klasa wewnętrzna)
  • Zagnieżdżona klasa statyczna.

Omówiliśmy już klasy wewnętrzne w poprzednim samouczku. Odwiedź Java Nested Class, jeśli chcesz dowiedzieć się więcej o klasach wewnętrznych.

W tym samouczku nauczymy się zagnieżdżonych klas statycznych.

Zagnieżdżona klasa statyczna Java

Używamy słowa kluczowego, staticaby uczynić naszą zagnieżdżoną klasę statyczną.

Uwaga: w Javie tylko klasy zagnieżdżone mogą być statyczne.

Podobnie jak zwykłe klasy, statyczne klasy zagnieżdżone mogą zawierać zarówno statyczne, jak i niestatyczne pola i metody. Na przykład,

 Class Animal ( static class Mammal ( // static and non-static members of Mammal ) // members of Animal ) 

Statyczne klasy zagnieżdżone są skojarzone z klasą zewnętrzną.

Aby uzyskać dostęp do statycznej klasy zagnieżdżonej, nie potrzebujemy obiektów klasy zewnętrznej.

Przykład: statyczna klasa zagnieżdżona

 class Animal ( // inner class class Reptile ( public void displayInfo() ( System.out.println("I am a reptile."); ) ) // static class static class Mammal ( public void displayInfo() ( System.out.println("I am a mammal."); ) ) ) class Main ( public static void main(String() args) ( // object creation of the outer class Animal animal = new Animal(); // object creation of the non-static class Animal.Reptile reptile = animal.new Reptile(); reptile.displayInfo(); // object creation of the static nested class Animal.Mammal mammal = new Animal.Mammal(); mammal.displayInfo(); ) ) 

Wynik

Jestem gadem. Jestem ssakiem.

W powyższym programie mamy dwie zagnieżdżone klasy Mammal i Reptile wewnątrz klasy Animal.

Do stworzenia obiektu niestatycznej klasy Reptile użyliśmy

 Animal.Reptile reptile = animal.new Reptile() 

Do stworzenia obiektu statycznej klasy Mammal użyliśmy

 Animal.Mammal mammal = new Animal.Mammal() 

Dostęp do członków klasy zewnętrznej

W Javie statyczne klasy zagnieżdżone są powiązane z klasą zewnętrzną. Z tego powodu statyczne klasy zagnieżdżone mają dostęp tylko do elementów członkowskich klasy (pól i metod statycznych) klasy zewnętrznej.

Zobaczmy, co się stanie, jeśli spróbujemy uzyskać dostęp do niestatycznych pól i metod klasy zewnętrznej.

Przykład: dostęp do niestatycznych elementów członkowskich

 class Animal ( static class Mammal ( public void displayInfo() ( System.out.println("I am a mammal."); ) ) class Reptile ( public void displayInfo() ( System.out.println("I am a reptile."); ) ) public void eat() ( System.out.println("I eat food."); ) ) 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(); ) ) 

Wynik

Main.java:28: błąd: nie można znaleźć symbolu ssak.eat (); symbol: metoda eat () lokalizacja: zmienna ssak typu Mammal 1 Błąd kompilatora Status wyjścia 1

W powyższym przykładzie utworzyliśmy niestatyczną metodę eat()wewnątrz klasy Animal.

Teraz, jeśli spróbujemy uzyskać dostęp eat()za pomocą ssaka obiektowego, kompilator wyświetli błąd.

Dzieje się tak, ponieważ ssak jest obiektem klasy statycznej i nie możemy uzyskać dostępu do metod niestatycznych z klas statycznych.

Statyczna klasa najwyższego poziomu

Jak wspomniano powyżej, tylko klasy zagnieżdżone mogą być statyczne. Nie możemy mieć statycznych klas na najwyższym poziomie.

Zobaczmy, co się stanie, jeśli spróbujemy utworzyć statyczną klasę najwyższego poziomu.

 static class Animal ( public static void displayInfo() ( System.out.println("I am an animal"); ) ) class Main ( public static void main(String() args) ( Animal.displayInfo(); ) ) 

Wynik

 Main.java:1: error: modyfikator static niedozwolone w tym miejscu statyczna klasa Animal (1 błąd status wyjścia kompilatora 1 

W powyższym przykładzie próbowaliśmy stworzyć statyczną klasę Animal. Ponieważ Java nie pozwala na statyczną klasę najwyższego poziomu, pojawi się błąd.

Interesujące artykuły...