Sobes.tech
Middle

Qanday ichki sinflar mavjud?

sobes.tech AI

AIdan javob

Java'da Ichki Sinflar (Nested Classes) ikki asosiy turga bo'linadi:

  1. Statik Ichki Sinflar (Static Nested Classes)

    • static modifikatori bilan belgilangan.
    • Oddiy statik a'zo sifatida harakat qiladi.
    • Tashqi sinfning statik a'zolariga kirishlari mumkin (hatto ular maxfiy bo'lsa ham).
    • Tashqi sinfning statik bo'lmagan a'zolariga to'g'ridan-to'g'ri kirish imkoniyati yo'q.
    • Tashqi sinfning nusxasiz yaratiladi: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
  2. Ichki Sinflar (Inner Classes)

    static bilan belgilangan emas va tashqi sinf nusxasi bilan bog'liq. Ular quyidagilarga bo'linadi:

    • A'zo Ichki Sinflar (Member Inner Classes)

      • Tashqi sinf a'zosi darajasida, lekin uning metodlaridan tashqarida e'lon qilinadi.
      • Tashqi sinfning barcha a'zolariga, jumladan maxfiylariga ham kirish huquqiga ega.
      • O'zining nusxasini yaratish uchun tashqi sinf nusxasiga ehtiyoj bor: OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
    • Mahalliy Sinflar (Local Classes)

      • Metodlar, konstruktorlar yoki boshlang'ich bloklar ichida yaratiladi.
      • Ularning ko'rinish doirasi ular e'lon qilingan blok bilan cheklangan.
      • E'lon qilish uchun public, private, protected kabi kirish modifikatorlari bilan bo'lishi mumkin emas.
      • Tashqi blokdagi final yoki amalda final bo'lgan mahalliy o'zgaruvchilarga kirishlari mumkin.
      • Ularni aniqlangan blokdan tashqarida ishlatib bo'lmaydi.
    • Noma'lum Sinflar (Anonymous Classes)

      • Aslida, nomi bo'lmagan mahalliy sinflardir.
      • Bir vaqtning o'zida e'lon qilinadi va nusxalanadi.
      • Ular abstrakt sinf yoki interfeysni "to'g'ridan-to'g'ri" amalga oshirish uchun ishlatiladi.
      • Mahalliy sinflar kabi, tashqi blokdagi final yoki amalda final bo'lgan mahalliy o'zgaruvchilarga kirish huquqiga ega.

Struktura misoli:

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

    // Statik ichki sinf
    static class StaticNestedClass {
        void accessOuter() {
            // Tashqi sinfning statik a'zolariga kirish mumkin
            int value = staticOuterField;
            // Statik bo'lmagan a'zolarga kirish mumkin emas
            // int value2 = outerField; // Kompilyatsiya xatosi
        }
    }

    // A'zo sinf (Ichki sinf)
    class MemberInnerClass {
        void accessOuter() {
            // Tashqi sinfning barcha a'zolariga kirish mumkin
            int value1 = outerField;
            int value2 = staticOuterField;
        }
    }

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

        // Mahalliy sinf
        class LocalClass {
            void accessOuter() {
                // Tashqi sinf a'zolari va mahalliy final/amalda final o'zgaruvchilarga kirish mumkin
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
            }
        }

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

        // Noma'lum sinf (Runnable ni amalga oshiruvchi)
        Runnable anonymousRunnable = new Runnable() {
            @Override
            public void run() {
                // Tashqi sinf a'zolari va mahalliy final/amalda final o'zgaruvchilarga kirish mumkin
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
                System.out.println("Mahalliy o'zgaruvch bilan ishlash: " + localValue);
            }
        };

        anonymousRunnable.run();
    }
}