Middle
Jakie są rodzaje klas zagnieżdżonych?
sobes.tech AI
Odpowiedź od AI
Klasy statyczne zagnieżdżone i klasy wewnętrzne (klasy zagnieżdżone niestatyczne).
-
Klasy zagnieżdżone statyczne:
- Deklarowane słowem kluczowym
static. - Mają dostęp tylko do statycznych członków (pól i metod) klasy zewnętrznej, w tym prywatnych.
- Nie mają bezpośredniego dostępu do niestatycznych członków klasy zewnętrznej.
- Mogą być tworzone bez instancji klasy zewnętrznej.
class Outer { private static int staticVar = 10; private int instanceVar = 20; static class StaticNested { void display() { System.out.println("Zmienne statyczne: " + staticVar); // System.out.println("Zmienne instancji: " + instanceVar); // Błąd kompilacji } } } - Deklarowane słowem kluczowym
-
Klasy wewnętrzne (klasy zagnieżdżone niestatyczne):
- Deklarowane bez słowa kluczowego
static. - Mają pełny dostęp do wszystkich członków (statycznych i niestatycznych) klasy zewnętrznej, w tym prywatnych.
- Nie mogą zawierać członków statycznych (pól lub metod), z wyjątkiem stałych finalnych.
- Wymagają instancji klasy zewnętrznej do utworzenia.
class Outer { private static int staticVar = 10; private int instanceVar = 20; class Inner { void display() { System.out.println("Zmienne statyczne: " + staticVar); System.out.println("Zmienne instancji: " + instanceVar); } } } - Deklarowane bez słowa kluczowego
-
Klasy lokalne:
- Deklarowane wewnątrz metod, konstruktorów lub bloków inicjalizacyjnych.
- Mają dostęp do wszystkich finalnych i efektywnie finalnych zmiennych lokalnych, a także do członków klasy zewnętrznej, w której są zdefiniowane.
- Zakres ich widoczności jest ograniczony do bloku, w którym są zadeklarowane.
class Outer { void myMethod() { final int localVar = 5; // Efektywnie final class LocalInner { void display() { System.out.println("Zmienne lokalne: " + localVar); } } LocalInner local = new LocalInner(); local.display(); } } -
Klasy anonimowe:
- Klasy lokalne bez nazwy.
- Tworzone i instancjonowane jednocześnie.
- Często używane do tworzenia implementacji interfejsów lub rozszerzania klas.
interface MyInterface { void doSomething(); } class Outer { void myMethod() { MyInterface anon = new MyInterface() { @Override public void doSomething() { System.out.println("Robienie czegoś anonimowo."); } }; anon.doSomething(); } }
Główne różnice między klasami statycznie zagnieżdżonymi a klasami wewnętrznymi:
| Cecha | Klasa statycznie zagnieżdżona | Klasa wewnętrzna |
|---|---|---|
| Słowo kluczowe | static |
Brak |
| Dostęp do członków | Tylko do statycznych członków | Do wszystkich członków klasy |
| tworzenie instancji | Bez instancji klasy zewnętrznej | Wymaga instancji klasy zewnętrznej |
| Członkowie statyczne | Mogą zawierać | Nie mogą zawierać (z wyjątkiem stałych) |