Sobes.tech
Middle

Jaké jsou rozdíly mezi vnořenými (nested) a vnitřními (inner) třídami v Javě?

sobes.tech AI

Odpověď od AI

  • Vnořené třídy (Nested classes): Statické členy vnější třídy. Nem mají přímý přístup k nestatickým členům (polím a metodám) vnější třídy, pouze přes instanci vnější třídy. Jsou deklarovány klíčovým slovem static.

  • Vnitřní třídy (Inner classes): Nestatické členy vnější třídy. Mají plný přístup ke všem členům (statickým i nestatickým) vnější třídy, včetně soukromých. Pro vytvoření instance vnitřní třídy je potřeba instance vnější třídy. Nepoužívají klíčové slovo static.

Příklad:

// Vnější třída
class Outer {
    private int outerField = 10;
    private static int staticOuterField = 20;

    // Statická vnořená třída
    static class StaticNestedClass {
        void display() {
            // Přístup pouze ke statickým členům vnější třídy
            System.out.println("Statická vnořená: " + staticOuterField);
            // Přímý přístup k outerField není možný
            // System.out.println(outerField); // Chyba kompilace
        }
    }

    // Nestatická vnitřní třída
    class InnerClass {
        void display() {
            // Přístup ke všem členům vnější třídy
            System.out.println("Vnitřní: " + outerField);
            System.out.println("Vnitřní (statická): " + staticOuterField);
        }
    }
}

// Použití
public class Main {
    public static void main(String[] args) {
        // Vytvoření instance statické vnořené třídy
        Outer.StaticNestedClass staticNested = new Outer.StaticNestedClass();
        staticNested.display();

        // Vytvoření instance vnitřní třídy vyžaduje instanci vnější třídy
        Outer outer = new Outer();
        Outer.InnerClass inner = outer.new InnerClass();
        inner.display();
    }
}
Vlastnost Vnořená třída (Nested Class) Vnitřní třída (Inner Class)
Klíčové slovo static Ne
Přístup k členům vnější třídy Pouze statické Všechno
Vyžaduje instanci vnější třídy pro vytvoření Ne Ano
Vazba s instancí vnější třídy Ne Ano