Sobes.tech
Middle

Кайсы ички класстардын түрлөрү бар?

sobes.tech AI

AIден жооп

Javaда ички класстар (Nested Classes) негизинен эки негизги түргө бөлүнөт:

  1. Статикалык ички класстар (Static Nested Classes)

    • static модификатору менен белгиленет.
    • жөнөкөй статикалык мүчөлөр сыяктуу иштешет.
    • тышкы класстын статикалык мүчөлөрүнө кире алышат (жеке болсо да).
    • тышкы класстын статикалык эмес мүчөлөрүнө түздөн-түз кире алышпайт.
    • тышкы класстын экземплярын түзбөстөн түзүлөт: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
  2. Ички класстар (Inner Classes)

    Ички класстар static модификатору жок жана тышкы класстын экземплярына байланыштуу. Алар бөлүнөт:

    • Мүчө-klassтар (Member Inner Classes)

      • тышкы класстын мүчөсү катары жарыяланат, бирок анын методдорунан тышкары.
      • бардык тышкы класстын мүчөлөрүнө, анын ичинде жеке мүчөлөрүнө да кире алышат.
      • тышкы класстын экземплярын талап кылат: OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
    • Жергиликтүү класстар (Local Classes)

      • методдордун, конструкторлордун же инит-блоктордун ичинде түзүлөт.
      • алардын көрүнүү чеги ошол блок менен чектелет.
      • жеткиликтүү мүчөлөргө (public, private, protected) ээ болбойт.
      • тышкы блоктун final же effectively final локалдык өзгөрмөлөрүнө кире алат.
      • алардын колдонулушу ошол блок менен чектелет.
    • Анонимдүү класстар (Anonymous Classes)

      • негизинен, аты жок жергиликтүү класстар.
      • бир эле учурда жарыяланат жана инстанцыланат.
      • абстракттык класс же интерфейсти "жасалма" түрдө ишке ашыруу үчүн колдонулат.
      • ошондой эле жергиликтүү класстар сыяктуу, final же effectively final локалдык өзгөрмөлөргө кире алат.

    Структуранын мисалы:

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

    // Статикалык ички класс
    static class StaticNestedClass {
        void accessOuter() {
            // Тышкы класстын статикалык мүчөлөрүнө кире алат
            int value = staticOuterField;
            // Тышкы класстын статикалык эмес мүчөлөрүнө кире албайт
            // int value2 = outerField; // Компиляция ката
        }
    }

    // Мүчө-klass (Ички класс)
    class MemberInnerClass {
        void accessOuter() {
            // Бардык мүчөлөргө кире алат
            int value1 = outerField;
            int value2 = staticOuterField;
        }
    }

    void methodWithLocalAndAnonymous() {
        final int localVar = 10; // эффективдүү final

        // Жергиликтүү класс
        class LocalClass {
            void accessOuter() {
                // Бардык мүчөлөргө жана жергиликтүү final/effectively final өзгөрмөлөргө кире алат
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
            }
        }

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

        // Анонимдүү класс (Runnable интерфейсин ишке ашыруу)
        Runnable anonymousRunnable = new Runnable() {
            @Override
            public void run() {
                // Бардык мүчөлөргө жана жергиликтүү final/effectively final өзгөрмөлөргө кире алат
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
                System.out.println("Running with local variable: " + localValue);
            }
        };

        anonymousRunnable.run();
    }
}