Sobes.tech
Middle

Aké druhy vnorených tried existujú?

sobes.tech AI

Odpoveď od AI

Vnorené triedy (Nested Classes) v Jave sa delia na dva hlavné typy:

  1. Statické vnorené triedy (Static Nested Classes)

    • Označené modifikátorom static.
    • Správajú sa ako bežné statické členy triedy-obalu.
    • Môžu pristupovať k statickým členom vonkajšej triedy (aj keď sú súkromné).
    • Nemajú priame prístup k nestatickým členom vonkajšej triedy.
    • Sú vytvorené bez inštancie vonkajšej triedy: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
  2. Vnorené triedy (Inner Classes)

    Vnorené triedy nie sú označené static a sú spojené s inštanciou vonkajšej triedy. Delenia na:

    • Členové triedy (Member Inner Classes)

      • Deklarované na úrovni člena triedy-obalu, ale mimo jej metód.
      • Majú prístup ku všetkým členom vonkajšej triedy, vrátane súkromných.
      • Vyžadujú inštanciu vonkajšej triedy na vytvorenie vlastnej inštancie: OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
    • Lokálne triedy (Local Classes)

      • Vytvárajú sa v rámci metód, konštruktorov alebo inicializačných blokov.
      • Rozsah ich platnosti je obmedzený na blok, v ktorom sú deklarované.
      • Nemôžu byť deklarované s prístupovými modifikátormi (public, private, protected).
      • Môžu pristupovať k final alebo efektívne final lokálnym premenným vonkajšieho bloku.
      • Nemôžu byť použité mimo bloku, v ktorom sú definované.
    • Nevnorené triedy (Anonymous Classes)

      • V podstate ide o lokálne triedy bez mena.
      • Deklarujú sa a inštancujú súčasne.
      • Používajú sa na implementáciu abstraktnej triedy alebo rozhrania "na mieste".
      • Rovnako ako lokálne triedy, majú prístup k final alebo efektívne final lokálnym premenným vonkajšieho bloku.

    Príklad štruktúry:

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

    // Statická vnorená trieda
    static class StaticNestedClass {
        void accessOuter() {
            // Môže sa odvolávať na statické členy vonkajšej triedy
            int value = staticOuterField;
            // Nemôže sa odvolávať na nestatické členy vonkajšej triedy
            // int value2 = outerField; // Chyba kompilácie
        }
    }

    // Členová trieda (Vnorená trieda)
    class MemberInnerClass {
        void accessOuter() {
            // Môže sa odvolávať na všetky členy vonkajšej triedy
            int value1 = outerField;
            int value2 = staticOuterField;
        }
    }

    void methodWithLocalAndAnonymous() {
        final int localVar = 10; // efektívne final

        // Lokálna trieda
        class LocalClass {
            void accessOuter() {
                // Môže sa odvolávať na členy vonkajšej triedy a lokálne final/efektívne final premenné
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
            }
        }

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

        // Nevnořená trieda (implementujúca rozhranie Runnable)
        Runnable anonymousRunnable = new Runnable() {
            @Override
            public void run() {
                // Môže sa odvolávať na členy vonkajšej triedy a lokálne final/efektívne final premenné
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
                System.out.println("Running with local variable: " + localValue);
            }
        };

        anonymousRunnable.run();
    }
}