Sobes.tech
Junior

Ichki sinflar nima?

sobes.tech AI

AIdan javob

Ichki sinflar (nested classes) — bu boshqa sinf ichida e'lon qilingan sinflar. Ular statik (static nested classes) yoki statik bo'lmagan (inner classes) bo'lishi mumkin.

Statik ichki sinflar:

  • static modifikatori bilan e'lon qilinadi.
  • Tashqi sinfning statik bo'lmagan a'zolariga to'g'ridan-to'g'ri kirish imkoniga ega emaslar (faqat tashqi sinf nusxasi orqali).
  • Statik va statik bo'lmagan a'zolarni o'z ichiga olishi mumkin.
  • Tashqi sinf nusxasidan mustaqil ravishda yaratiladi.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public static class StaticNested {
        // staticOuterVar ga kirish imkoniyati bor
        public void printStaticValue() {
            System.out.println(staticOuterVar);
        }

        // instanceOuterVar ga to'g'ridan-to'g'ri kirish imkoniyati yo'q
        // public void printInstanceValue() {
        //     System.out.println(instanceOuterVar); // Kompilyatsiya xatosi
        // }
    }
}

Statik ichki sinfdan foydalanish:

// Statik ichki sinf nusxasini yaratish misoli
Outer.StaticNested nestedObject = new Outer.StaticNested();
nestedObject.printStaticValue(); // 10 ni chiqaradi

Ichki sinflar (Inner Classes):

  • static bilan e'lon qilinmaydi.
  • Tashqi sinfning barcha a'zolariga, jumladan maxfiylariga ham to'liq kirish imkoniyatiga ega.
  • Statik a'zolarni o'z ichiga olmaydi (faqat kompilyatsiya vaqti konstantalarini hisobga olmaganda).
  • Yaratilishi uchun tashqi sinf nusxasi kerak.
public class Outer {
    private static int staticOuterVar = 10;
    private int instanceOuterVar = 20;

    public class Inner {
        // staticOuterVar va instanceOuterVar ga kirish imkoniyati bor
        public void printValues() {
            System.out.println(staticOuterVar); // Mavjud
            System.out.println(instanceOuterVar); // Mavjud
        }
    }
}

Inner sinfdan foydalanish:

// Inner sinf nusxasini yaratish misoli
Outer outerObject = new Outer();
Outer.Inner innerObject = outerObject.new Inner();
innerObject.printValues(); // 10 va 20 ni chiqaradi

Ichki sinflardan foydalanishning afzalliklari:

  1. Mantiqiy guruhlash: Faqat boshqa sinf tomonidan ishlatiladigan sinflar ichida mantiqiy tarzda guruhlanishi mumkin.
  2. Encapsulation: Ichki sinflar, tashqi sinfning maxfiy a'zolariga kirish huquqiga ega.
  3. O'qilishi va saqlashni osonlashtirish: Kod yanada tartibli bo'ladi.

Statik bo'lmagan ichki sinf turlari:

  • Mahalliy sinflar: Metod ichida e'lon qilinadi.
  • Noma'lum sinflar (Anonymous classes): Aniq nomi bo'lmagan sinflar, odatda, abstrakt sinf, interfeys yoki bazaviy sinfning nusxasini yaratish va metodlarni qayta yozish uchun ishlatiladi.

Mahalliy sinf:

public class Outer {
    public void myMethod() {
        class LocalClass {
            void display() {
                System.out.println("Mahalliy sinf ichida");
            }
        }
        LocalClass local = new LocalClass();
        local.display();
    }
}

Noma'lum sinf (interfeys bilan misol):

interface Greeting {
    void sayHello();
}

public class Outer {
    public void greet() {
        Greeting anonymousGreeting = new Greeting() {
            @Override
            public void sayHello() {
                System.out.println("Noma'lum sinfdan salom!");
            }
        };
        anonymousGreeting.sayHello();
    }
}