Sobes.tech
Middle

İç içe sınıflar hakkında ve hangi durumlarda kullanıldıklarını anlat.

sobes.tech yapay zeka

AI'dan gelen yanıt

Java'da İç İçe Sınıflar (Nested Classes), başka bir sınıfın içinde tanımlanan sınıflardır. İki türe ayrılırlar: Statik (Static Nested Classes) ve İç Sınıflar (Inner Classes).

Statik İç İçe Sınıflar

  • static modifikatörü ile tanımlanırlar.
  • Yalnızca dış sınıfın statik üyelerine erişebilirler (gizlenmiş olsalar bile).
  • Dış sınıfın statik olmayan üyelerine erişimleri yoktur.
  • Bir statik iç içe sınıf örneği oluşturmak için dış sınıf örneği gerekmez:
    // Dış sınıf
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // Statik iç içe sınıf
        static class StaticNested {
            void accessOuter() {
                // Dış sınıfın statik alanına erişim
                System.out.println(Outer.outerStaticField);
                // outerInstanceField'a erişim yok
                // System.out.println(outerInstanceField); // Derleme hatası
            }
        }
    }
    
    // Statik iç içe sınıfın kullanımı
    class Main {
        public static void main(String[] args) {
            Outer.StaticNested nestedObject = new Outer.StaticNested();
            nestedObject.accessOuter();
        }
    }
    

İç Sınıflar

  • static modifikatörü ile tanımlanmazlar.
  • Tüm dış sınıf üyelerine (statik ve statik olmayan, gizlenmiş olsalar bile) tam erişim sağlarlar.
  • Bir iç sınıf örneği, yalnızca bir dış sınıf örneği ile var olabilir.
  • Bir iç sınıf örneği oluşturmak için, dış sınıfın bir örneği gereklidir:
    // Dış sınıf
    class Outer {
        static int outerStaticField;
        int outerInstanceField;
    
        // İç sınıf
        class Inner {
            void accessOuter() {
                // Dış sınıfın statik alanına erişim
                System.out.println(Outer.outerStaticField);
                // Dış sınıfın statik olmayan alanına erişim
                System.out.println(outerInstanceField);
            }
        }
    }
    
    // İç sınıfın kullanımı
    class Main {
        public static void main(String[] args) {
            Outer outerObject = new Outer();
            Outer.Inner innerObject = outerObject.new Inner();
            innerObject.accessOuter();
        }
    }
    

İç sınıflar şu alt türlere ayrılır:

  • Düzenli iç sınıflar: Dış sınıfın gövdesi içinde doğrudan tanımlanmışlardır.
  • Yerel iç sınıflar: Metotlar, yapıcılar veya başlatma blokları içinde tanımlanırlar ve sadece bu blok içinde görünürler.
    class Outer {
        void display() {
            class LocalInner { // Yerel iç sınıf
                void message() {
                    System.out.println("Yerel iç sınıf");
                }
            }
            LocalInner obj = new LocalInner();
            obj.message();
        }
    }
    
  • Anonim iç sınıflar: İsimsiz sınıflardır, bir sınıf veya arayüz örneği oluşturmak ve uygulamalarını hemen sağlamak için kullanılırlar. Sıklıkla olay dinleyicileri ile kullanılırlar.
    interface Greeting {
        void sayHello();
    }
    
    class Main {
        public static void main(String[] args) {
            Greeting greeting = new Greeting() { // İsimsiz iç sınıf
                @Override
                public void sayHello() {
                    System.out.println("Merhaba!");
                }
            };
            greeting.sayHello();
        }
    }
    

İç sınıflar ne zaman kullanılır:

  • Mantıksal gruplama: Bir sınıf sadece başka bir sınıfın parçasıysa ve birlikte gruplanması anlamlıysa. Bu, kodun okunabilirliğini ve bakımını artırır.
  • Kapsülleme: İç sınıflar, dış sınıfın üyelerine erişebilir, bu da daha sıkı bir ilişki sağlar ve uygulama detaylarının gizlenmesine olanak tanır.
  • Daha okunabilir kod: Küçük ve basit bir sınıf sadece bir yerde kullanılıyorsa, iç içe yapmak kodu daha düzenli hale getirebilir.
  • Kaynakların verimli kullanımı: İç sınıflar, dış sınıfın üyelerine erişim sağlar, bunları açıkça iletmeye gerek kalmadan, bu da kodu basitleştirebilir. Bir örnek, yineleyicilerin uygulanmasıdır.
  • Arayüzlerin uygulanması veya sınıfların bağlam içinde genişletilmesi: Anonim iç sınıflar, genellikle arayüzlerin veya soyut sınıfların "canlı" olarak kompakt bir şekilde uygulanması için kullanılır.
  • Uygulama gizleme: Bir sınıfı başka bir sınıfın içine gizlemek, dışarıdan görünmez hale getirmek.

Statik iç sınıflar ile iç sınıflar arasındaki karşılaştırma:

Parametre Statik iç sınıf İç sınıf
static modifikatorü Evet Hayır
Dış sınıfın üyelerine erişim Yalnızca statik (özel olanlar dahil) Tüm üyeler (statik ve statik olmayan, özel)
Oluşturmak için dış sınıf örneği gerekir mi Hayır Evet
Dış sınıf örneği ile ilişki Yok Var

İç sınıfın statik olup olmaması, iç sınıfın dış sınıfın statik olmayan üyelerine erişip erişmediğine bağlıdır. Eğer erişmesi gerekiyorsa, iç sınıf kullanın. Eğer gerek yoksa, statik iç sınıf daha uygun olur, çünkü dış sınıf örneğine bağlı değildir ve daha verimli olabilir.