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:
-
Statik İç İçe Sınıflar (Static Nested Classes)
staticmodifiyeri 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();.
-
Dış Sınıflar (Inner Classes)
staticile 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
finalveya etkilifinalyerel 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
finalveya etkilifinalyerel 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();
}
}