Jakie rodzaje klas zagnieżdżonych występują w języku programowania?
sobes.tech AI
Odpowiedź od AI
Klasy zagnieżdżone w Java:
-
Statyczne klasy zagnieżdżone (Static Nested Classes): Zachowują się jak zwykłe statyczne członkowie klasy. Nie mają dostępu do nie-statycznych członków klasy zewnętrznej. Tworzone są bez instancji klasy zewnętrznej.
public class Outer { private static String staticMsg = "Statyczna wiadomość"; private String instanceMsg = "Wiadomość instancji"; static class StaticNested { void displayStatic() { // Dostęp do statycznych członków klasy zewnętrznej System.out.println(staticMsg); // Brak dostępu do nie-statycznych członków klasy zewnętrznej // System.out.println(instanceMsg); // Błąd kompilacji } } } -
Klasy wewnętrzne (Inner Classes): Są powiązane z instancją klasy zewnętrznej. Mają pełny dostęp do wszystkich (statycznych i nie-statycznych) członków klasy zewnętrznej, w tym prywatnych. Mogą być zadeklarowane jako
private,protected,package-privatelubpublic.public class Outer { private static String staticMsg = "Statyczna wiadomość"; private String instanceMsg = "Wiadomość instancji"; class Inner { void display() { // Dostęp do statycznych i nie-statycznych członków klasy zewnętrznej System.out.println(staticMsg); System.out.println(instanceMsg); } } } -
Klasy lokalne (Local Classes): Deklarowane wewnątrz bloku (metody, konstruktora lub statycznego inicjalizatora). Dostępne tylko w tym bloku. Mogą odwoływać się do zmiennych lokalnych i parametrów bloku, które są
finallub efektywniefinal, a także do wszystkich członków klasy zewnętrznej.public class Outer { private String instanceMsg = "Wiadomość z instancji"; void methodWithLocalClass() { final String localVar = "Zmienna lokalna"; // lub efektywnie final class Local { void display() { System.out.println(instanceMsg); System.out.println(localVar); } } Local localObj = new Local(); localObj.display(); } } -
Klasy anonimowe (Anonymous Classes): Są to klasy lokalne bez nazwy. Używane do jednoczesnego deklarowania i tworzenia instancji klasy, która implementuje interfejs lub rozszerza klasę. Przydatne do tworzenia małych, jednorazowych obiektów.
public class Outer { void methodWithAnonymousClass() { // Klasa anonimowa implementująca interfejs Runnable Runnable myRunnable = new Runnable() { @Override public void run() { System.out.println("Uruchamianie z klasy anonimowej"); } }; new Thread(myRunnable).start(); // Klasa anonimowa rozszerzająca klasę Thread Thread myThread = new Thread() { @Override public void run() { System.out.println("Uruchamianie z klasy anonimowej rozszerzającej Thread"); } }; myThread.start(); } }
Porównanie rodzajów klas zagnieżdżonych:
| Typ klasy | Miejsce deklaracji | Dostęp do członków klasy zewnętrznej | Czy wymaga instancji klasy zewnętrznej do utworzenia? | Modyfikatory dostępu |
|---|---|---|---|---|
| Statyczna klasa zagnieżdżona | Wewnątrz klasy, z użyciem słowa kluczowego static. |
Tylko do statycznych. | Nie | Wszystkie |
| Klasa wewnętrzna | Wewnątrz klasy (nie statyczna). | Do wszystkich (statycznych i nie-statycznych). | Tak | Wszystkie |
| Klasa lokalna | Wewnątrz bloku (metody, konstruktory, inicjalizatory). | Do wszystkich członków klasy zewnętrznej + final lub efektywnie final lokalnych zmiennych. |
Tak | Nie (final lub abstract domyślnie) |
| Klasa anonimowa | Wewnątrz bloku (wyrażenie). | Do wszystkich członków klasy zewnętrznej + final lub efektywnie final lokalnych zmiennych. |
Tak | Nie |