Sobes.tech
Middle

Hansı daxili sinif növləri mövcuddur?

sobes.tech Süni İntellekt

AI-dan cavab

Java-da Nested Classes (Daxili Siniflər) iki əsas növə bölünür:

  1. Statik Daxili Siniflər (Static Nested Classes)

    • static modifieri ilə işarələnmişdir.
    • Adətən konteyner sinifinin statik üzvləri kimi davranır.
    • Xarici sinifin statik üzvlərinə daxil ola bilər (hətta onlar özəl olsa belə).
    • Xarici sinifin qeyri-statik üzvlərinə birbaşa daxil ola bilməz.
    • Xarici sinif nümunəsi olmadan yaradılır: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
  2. Daxili Siniflər (Inner Classes)

    Daxili siniflər static ilə işarələnmir və xarici sinif nümunəsinə bağlıdırlar. Onlar aşağıdakı alt növlərə bölünür:

    • Üzv Daxili Siniflər (Member Inner Classes)

      • Konteyner sinifinin üzv səviyyəsində elan edilir, amma metodların xaricində.
      • Xarici sinifin bütün üzvlərinə daxil ola bilər, o cümlədən özəl olanlara.
      • Öz nümunəsini yaratmaq üçün xarici sinif nümunəsi tələb olunur: OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
    • Yerli Siniflər (Local Classes)

      • Metodlar, konstruktörlər və ya inisialisasiya blokları daxilində yaradılır.
      • Görünüş sahəsi elan olunduğu blokla məhdudlaşır.
      • Giriş modifikatorları (public, private, protected) ilə elan edilə bilməz.
      • Xarici blokun final və ya effektiv final olan yerli dəyişənlərinə daxil ola bilər.
      • Təyin olunduğu blok xaricində istifadə edilə bilməz.
    • Anonim Siniflər (Anonymous Classes)

      • Əslində, adı olmayan yerli siniflərdir.
      • Eyni zamanda elan edilir və nümunə alınır.
      • Abstrakt sinfi və ya interfeysi "canlı" olaraq həyata keçirmək üçün istifadə olunur.
      • Yerli siniflər kimi, xarici blokun final və ya effektiv final yerli dəyişənlərinə daxil ola bilər.

    Struktur nümunəsi:

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

    // Statik daxili sinif
    static class StaticNestedClass {
        void accessOuter() {
            // Xarici sinifin statik üzvlərinə daxil ola bilər
            int value = staticOuterField;
            // Xarici sinifin qeyri-statik üzvlərinə daxil ola bilməz
            // int value2 = outerField; // Yığım xətası
        }
    }

    // Üzv daxili sinif
    class MemberInnerClass {
        void accessOuter() {
            // Bütün xarici sinif üzvlərinə daxil ola bilər
            int value1 = outerField;
            int value2 = staticOuterField;
        }
    }

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

        // Yerli sinif
        class LocalClass {
            void accessOuter() {
                // Xarici sinif üzvlərinə və yerli final/effectively final dəyişənlərə daxil ola bilər
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
            }
        }

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

        // Anonim sinif (Runnable interfeysini həyata keçirən)
        Runnable anonymousRunnable = new Runnable() {
            @Override
            public void run() {
                // Xarici sinif üzvlərinə və yerli final/effectively final dəyişənlərə daxil ola bilər
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
                System.out.println("Running with local variable: " + localValue);
            }
        };

        anonymousRunnable.run();
    }
}