Sobes.tech
Junior

Ичке класстар эмне?

sobes.tech AI

AIден жооп

Ичке класстар (nested classes) — башка класс ичинде жарыяланган класстар. Алар статикалык (static nested classes) жана статикалык эмес (inner classes) болушу мүмкүн.

Статикалык ички класстар:

  • static модификатору менен жарыяланат.
  • Түздөн-түз тышкы класстын статикалык эмес мүчөлөрүнө кире алышпайт (тек тышкы класстын экземпляры аркылуу).
  • Статикалык жана статикалык эмес мүчөлөрдү камтышы мүмкүн.
  • Тышкы класстын экземплярысыз түзүлөт.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public static class StaticNested {
        // staticOuterVarга кирүү
        public void printStaticValue() {
            System.out.println(staticOuterVar);
        }

        // instanceOuterVarга түздөн-түз кире албайт
        // public void printInstanceValue() {
        //     System.out.println(instanceOuterVar); // Компиляция ката
        // }
    }
}

Статикалык ички классты колдонуу:

// Статикалык ички класстын экземплярын түзүү мисалы
Outer.StaticNested nestedObject = new Outer.StaticNested();
nestedObject.printStaticValue(); // 10 чыгарат

Ичке класстар (Inner Classes):

  • static модификатору менен жарыяланбайт.
  • Бардык тышкы класстын мүчөлөрүнө, анын ичинде жеке мүчөлөргө да толук кирүүгө ээ.
  • Статикалык мүчөлөрдү (константтарды жыйымга чыгарбай) камтышы мүмкүн эмес.
  • Тышкы класстын экземпляры керек.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public class Inner {
        // staticOuterVar жана instanceOuterVarга кирүү
        public void printValues() {
            System.out.println(staticOuterVar); // Жеткиликтүү
            System.out.println(instanceOuterVar); // Жеткиликтүү
        }
    }
}

Ички класстын экземплярын түзүү:

// Ички класстын экземплярын түзүү
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new Inner();
innerObject.printValues(); // 10 жана 20 чыгарат

Ичке класстарды колдонуу артыкчылыктары:

  1. Логикалык топтоо: Башка класс тарабынан гана колдонулуучу класстар логикалык түрдө топтолушу мүмкүн.
  2. Энкапсуляция: Ички класстар тышкы класстын жеке мүчөлөрүнө кире алышат.
  3. Окумдуулук жана колдоо: Кодду уюштурууну жакшыртат.

Ички класстардын түрлөрү:

  • Жергиликтүү класстар: Методдун ичинде жарыяланат.
  • Анонимдик класстар: Аты жок класстар, көбүнчө абстракттуу класс, интерфейс же негизги класс үчүн экземпляр түзүүдө колдонулат жана методдорду кайра аныктоого мүмкүндүк берет.

Жергиликтүү класс:

public class Outer {
    public void myMethod() {
        class LocalClass {
            void display() {
                System.out.println("Жергиликтүү класстын ичинде");
            }
        }
        LocalClass local = new LocalClass();
        local.display();
    }
}

Анонимдик класс (интерфейс менен мисал):

interface Greeting {
    void sayHello();
}

public class Outer {
    public void greet() {
        Greeting anonymousGreeting = new Greeting() {
            @Override
            public void sayHello() {
                System.out.println("Анонимдик класстан салам!");
            }
        };
        anonymousGreeting.sayHello();
    }
}