Sobes.tech
Middle

Jakie rodzaje klas zagnieżdżonych występują w języku programowania?

sobes.tech AI

Odpowiedź od AI

Klasy zagnieżdżone w Java:

  1. 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
            }
        }
    }
    
  2. 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-private lub public.

    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);
            }
        }
    }
    
  3. 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ą final lub efektywnie final, 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();
        }
    }
    
  4. 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