Sobes.tech
Middle

Milyen típusú beágyazott osztályok léteznek?

sobes.tech MI

Válasz az MI-től

A Java-ban a beágyazott osztályok (Nested Classes) két fő típusra oszthatók:

  1. Statikus beágyazott osztályok (Static Nested Classes)

    • A static módosítóval vannak ellátva.
    • Úgy viselkednek, mint a konténer osztály szokásos statikus tagjai.
    • Hozzáférhetnek a külső osztály statikus tagjaihoz (még akkor is, ha privátok).
    • Nincs közvetlen hozzáférésük a külső osztály nem-statikus tagjaihoz.
    • Nélkül hozhatók létre példány nélkül: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
  2. Belső osztályok (Inner Classes)

    A belső osztályok nem static-ek, és a külső osztály példányához kötöttek. Alcsoportokra oszthatók:

    • Tag osztályok (Member Inner Classes)

      • A konténer osztály tagjaként vannak deklarálva, de a metódusokon kívül.
      • Minden külső osztály taghoz hozzáférnek, beleértve a privátokat is.
      • Egy példány külső osztály példányára van szükség a példányuk létrehozásához: OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
    • Helyi osztályok (Local Classes)

      • Metódusok, konstruktorok vagy inicializáló blokkok belsejében jönnek létre.
      • A láthatóságuk a deklarációjukat tartalmazó blokkra korlátozódik.
      • Nem lehet hozzáférési módosítókat (pl. public, private, protected) használni.
      • Hozzáférhetnek a külső blokk final vagy effektív final helyi változóihoz.
      • Nem használhatók a deklarációjukon kívül.
    • Névtelen osztályok (Anonymous Classes)

      • Gyakorlatilag névtelen helyi osztályok.
      • Egyidejűleg deklarálják és példányosítják őket.
      • Absztrakt osztály vagy interfész "éles" megvalósítására használják.
      • Hasonlóan a helyi osztályokhoz, hozzáférnek a final vagy effektív final helyi változókhoz a külső blokkban.

    Példaszerkezet:

class OuterClass {
    private int outerField;
    private static int staticOuterField;

    // Statikus beágyazott osztály
    static class StaticNestedClass {
        void accessOuter() {
            // Hozzáférhet a külső osztály statikus tagjaihoz
            int value = staticOuterField;
            // Nem férhet hozzá a nem-statikus tagokhoz
            // int value2 = outerField; // Fordítási hiba
        }
    }

    // Tag osztály (Belső osztály)
    class MemberInnerClass {
        void accessOuter() {
            // Hozzáférhet minden külső osztály taghoz
            int value1 = outerField;
            int value2 = staticOuterField;
        }
    }

    void methodWithLocalAndAnonymous() {
        final int localVar = 10; // effektív final

        // Helyi osztály
        class LocalClass {
            void accessOuter() {
                // Hozzáférhet a külső osztály tagjaihoz és a helyi final/effectively final változókhoz
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
            }
        }

        LocalClass localObj = new LocalClass();
        localObj.accessOuter();

        // Névtelen osztály (Runnable interfész megvalósítása)
        Runnable anonymousRunnable = new Runnable() {
            @Override
            public void run() {
                // Hozzáférhet a külső osztály tagjaihoz és a helyi final/effectively final változókhoz
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
                System.out.println("Running with local variable: " + localValue);
            }
        };

        anonymousRunnable.run();
    }
}