Sobes.tech
Middle

İç içe sınıfların hangi türleri vardır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Java'da İç İçe Sınıflar (Nested Classes) iki ana türe ayrılır:

  1. Statik İç İçe Sınıflar (Static Nested Classes)

    • static modifiyeri ile işaretlenir.
    • Normal statik üye gibi davranırlar.
    • Dış sınıfın statik üyelerine erişebilirler (özel olsa bile).
    • Dış sınıfın statik olmayan üyelerine doğrudan erişemezler.
    • Bir dış sınıf örneği olmadan oluşturulabilirler: OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();.
  2. Dış Sınıflar (Inner Classes)

    static ile işaretlenmemiştir ve dış sınıfın bir örneği ile ilişkilidir. Alt türleri:

    • Üye İç Sınıflar (Member Inner Classes)

      • Dış sınıfın üyesi seviyesinde, ama metodların dışında tanımlanır.
      • Tüm dış sınıf üyelerine, hatta özel olanlara bile erişebilirler.
      • Kendi örneklerini oluşturmak için dış sınıfın bir örneğine ihtiyaç duyarlar: OuterClass outerObject = new OuterClass(); OuterClass.MemberInnerClass innerObject = outerObject.new MemberInnerClass();.
    • Yerel Sınıflar (Local Classes)

      • Metodlar, yapıcılar veya başlatma blokları içinde oluşturulur.
      • Görünürlükleri, tanımlandıkları blokla sınırlıdır.
      • Erişim belirteçleri (public, private, protected) ile tanımlanamazlar.
      • Dış bloktaki final veya etkili final yerel değişkenlere erişebilirler.
      • Tanımlandıkları blok dışında kullanılamazlar.
    • Anonim Sınıflar (Anonymous Classes)

      • Aslında, isimleri olmayan yerel sınıflardır.
      • Aynı anda tanımlanıp örneklendirilirler.
      • Anlamlı bir sınıf veya arayüzü "canlı" olarak uygulamak için kullanılırlar.
      • Yerel sınıflar gibi, dış bloktaki final veya etkili final yerel değişkenlere erişebilirler.

Yapı örneği:

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

    // Statik iç içe sınıf
    static class StaticNestedClass {
        void accessOuter() {
            // Dış sınıfın statik üyelerine erişebilir
            int value = staticOuterField;
            // Statik olmayan üyelere erişemez
            // int value2 = outerField; // Derleme hatası
        }
    }

    // Üye iç sınıf (iç sınıf)
    class MemberInnerClass {
        void accessOuter() {
            // Tüm dış sınıf üyelerine erişebilir
            int value1 = outerField;
            int value2 = staticOuterField;
        }
    }

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

        // Yerel sınıf
        class LocalClass {
            void accessOuter() {
                // Dış sınıf üyelerine ve yerel final/etkili final değişkenlere erişebilir
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
            }
        }

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

        // Anonim sınıf (Runnable implementasyonu)
        Runnable anonymousRunnable = new Runnable() {
            @Override
            public void run() {
                // Dış sınıf üyelerine ve yerel final/etkili final değişkenlere erişebilir
                int value1 = outerField;
                int value2 = staticOuterField;
                int localValue = localVar;
                System.out.println("Yerel değişkenle çalışma: " + localValue);
            }
        };

        anonymousRunnable.run();
    }
}