Sobes.tech
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
            }
        }
    }
    
  • 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);
            }
        }
    }
    
  • 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)