Sobes.tech
Middle

Jakie są różnice między klasami zagnieżdżonymi (nested) a klasami wewnętrznymi (inner) w Java?

sobes.tech AI

Odpowiedź od AI

  • Klasy zagnieżdżone (Nested classes): Statyczne członki klasy zewnętrznej. Nie mają bezpośredniego dostępu do członków niestatycznych (pól i metod) klasy zewnętrznej, tylko przez instancję klasy zewnętrznej. Są deklarowane słowem kluczowym static.

  • Klasy wewnętrzne (Inner classes): Niestatyczne członki klasy zewnętrznej. Mają pełny dostęp do wszystkich członków (statycznych i niestatycznych) klasy zewnętrznej, w tym prywatnych. Do tworzenia instancji klasy wewnętrznej potrzebna jest instancja klasy zewnętrznej. Nie używają słowa kluczowego static.

Przykład:

// Klasa zewnętrzna
class Outer {
    private int outerField = 10;
    private static int staticOuterField = 20;

    // Statyczna klasa zagnieżdżona
    static class StaticNestedClass {
        void display() {
            // Dostęp tylko do statycznych członków klasy zewnętrznej
            System.out.println("Statyczna klasa zagnieżdżona: " + staticOuterField);
            // Brak bezpośredniego dostępu do outerField
            // System.out.println(outerField); // Błąd kompilacji
        }
    }

    // Klasa wewnętrzna niestatyczna
    class InnerClass {
        void display() {
            // Dostęp do wszystkich członków klasy zewnętrznej
            System.out.println("Wewnętrzna: " + outerField);
            System.out.println("Wewnętrzna (statyczna): " + staticOuterField);
        }
    }
}

// Użycie
public class Main {
    public static void main(String[] args) {
        // Tworzenie instancji klasy zagnieżdżonej statycznej
        Outer.StaticNestedClass staticNested = new Outer.StaticNestedClass();
        staticNested.display();

        // Tworzenie instancji klasy wewnętrznej wymaga instancji klasy zewnętrznej
        Outer outer = new Outer();
        Outer.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}
Cecha Klasa zagnieżdżona (Nested Class) Klasa wewnętrzna (Inner Class)
Słowo kluczowe static Nie
Dostęp do członków klasy zewnętrznej Tylko statyczne Wszystkie
Wymaga instancji klasy zewnętrznej do utworzenia Nie Tak
Powiązanie z instancją klasy zewnętrznej Nie Tak