Sobes.tech
Middle

Kokie yra vidinių klasių tipai?

sobes.tech AI

Atsakymas iš AI

Java viduje esančios klasės (Nested Classes) iš esmės skirstomos į du pagrindinius tipus:

  1. Statinės vidinės klasės (Static Nested Classes)

    • pažymėtos static modifikatoriumi.
    • elgiasi kaip įprasti statiniai klasės nariai.
    • gali pasiekti išorinės klasės statinius narius (net jei jie yra privačiai).
    • neturi tiesioginio priėjimo prie išorinės klasės nestatinių narių.
    • kuriamos be išorinės klasės egzemplioriaus: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
  2. Vidinės klasės (Inner Classes)

    Vidinės klasės nėra pažymėtos static ir yra susijusios su išorinės klasės egzemplioriumi. Jos skirstomos į:

    • Nario klasės (Member Inner Classes)

      • deklaruojamos kaip išorinės klasės nariai, bet už jos metodų ribų.
      • turi prieigą prie visų išorinės klasės narių, įskaitant privačius.
      • reikalauja išorinės klasės egzemplioriaus: OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
    • Vietinės klasės (Local Classes)

      • kuriamos metodų, konstruktorių ar inicializacijos blokų viduje.
      • jų matomumas yra ribotas to bloko ribose.
      • negali būti deklaruotos su prieigos modifikatoriais (public, private, protected).
      • gali naudotis final arba efektyviai final lokalinių kintamųjų iš išorinio bloko.
      • negali būti naudojamos už to bloko ribų.
    • Anoniminės klasės (Anonymous Classes)

      • iš esmės, tai be vardo vietinės klasės.
      • deklaruojamos ir instancijuojamos vienu metu.
      • naudojamos įgyvendinti abstraktų klasę ar sąsają "skraidant".
      • kaip ir vietinės klasės, turi prieigą prie final arba efektyviai final lokalinių kintamųjų iš išorinio bloko.

    Pavyzdinė struktūra:

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

    // Statinė vidinė klasė
    static class StaticNestedClass {
        void accessOuter() {
            // Gali pasiekti išorinės klasės statinius narius
            int value = staticOuterField;
            // Negali pasiekti nestatinių narių
            // int value2 = outerField; // Kompiliacijos klaida
        }
    }

    // Nario klasė (Vidinė klasė)
    class MemberInnerClass {
        void accessOuter() {
            // Gali pasiekti visus narius
            int value1 = outerField;
            int value2 = staticOuterField;
        }
    }

    void methodWithLocalAndAnonymous() {
        final int localVar = 10; // efektyviai final

        // Vietinė klasė
        class LocalClass {
            void accessOuter() {
                // Gali pasiekti išorinės klasės narius ir vietinius final/efektyviai final kintamuosius
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
            }
        }

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

        // Anoniminė klasė (įgyvendinanti Runnable)
        Runnable anonymousRunnable = new Runnable() {
            @Override
            public void run() {
                // Gali pasiekti išorinės klasės narius ir vietinius final/efektyviai final kintamuosius
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
                System.out.println("Running with local variable: " + localValue);
            }
        };

        anonymousRunnable.run();
    }
}