İÇ İÇE SINIFLAR
Bundan bir önceki dersimizde dahili üye sınıflardan bahsetmiştim. Bu dersimizde de Local ve Anonymous sınıflardan bahsedeceğim.
Local Class / Yerel Sınıflar
Öncelikle Dahili ve yerel sınıf farkından bahsetmekte fayda var. Yerel sınıfları herhangi belli bir alanda oluşturabiliriz. Örneğin bir metodun veya bir döngünün içinde. Bir işlemin gerçekleşmesi için bir döngünün çalıştırıldığını düşünün. Bu döngünün içinde bir sınıf olsun. Bu neyi gösteriyor?
Bu sınıfımızın çalışma aralığı o döngünün başlangıcına ve sonuna bağlıdır. İş süreci bittiğinde sınıfımızın da işi bitmiş oluyor.
Şimdi bahsettiğimiz bu şeye uygun bir örnek yapalım aşağıda. metot içinde sınıfımız olsun.
public class Main { //Çevreleyici Sınıfımız
public static void main(String[] args) { //Main Sınıfının metodu
class AltSinif{ //main metodunun sınıfı
void mesaj(){ //AltSinif sinifinin metodu
System.out.println("Mesaj Ekrana Basıldı.");
}
}
AltSinif as = new AltSinif();
as.mesaj();
}
}
Genelden özele doğru belirtmek gerekirse;
Main sınıf > main metodu > AltSinif sınıfı > mesaj metodu
Local sınıfımızı başka bir yerde oluşturup kullanalım şimdi.
public class Main {
public static void main(String[] args) {
int i = 6;
if (i > 5){
class MrCaracal{
void mrcaracal(){
System.out.println("Local Sınıfımız Çalıştı");
}
}
MrCaracal a = new MrCaracal();
a.mrcaracal();
}else{
System.out.println("Local Sınıfımız Çalışmadı");
}
}
}
Üstteki örneğimizde ise MrCaracal sınıfımızı bir if bloğunun içinde oluşturduk. MrCaracal varlığı if bloğunun başına ve sonuna bağlıdır. if bloğu son bulduğunda sınıfımız da son bulacaktır.
İşte bu şekilde bir metodun, if bloğunun veya bir döngü gibi yerlerin içine oluşturulan sınıflara Local / Yerel sınıf denir.
Anonymous Class / İsimsiz Sınıflar
Eğer Override dersimizi incelediyseniz veya override’nin ne olduğunu biliyorsanız bir şeylerin size tanıdık geldiğini göreceksiniz.
Konunun tam anlaşılması için önce yeni bir sınıf oluşturalım ve sınıfın içindeki metodu çağırıp ekrana ne çıktı verdiğine bakalım.

Üstteki resimde de görüldüğü gibi normal bir şekilde sınıfımız ve metodumuz çalıştı.
Şimdi de Anonymous class yöntemini kullanalım.

Resimde de görüldüğü üzere sınıfımızın içindeki metot override edildi. İşte bu gibi işlemlerin yapılmasına Anonymous Class denir.
Oracle‘nin sayfasını incelediğim zaman bu konu hakkında çok daha iyi bir örnek buldum. İlk bakışta kafanız karışsa da neler olup bittiğini anlamaya çalışın. Örnekte metot ve değişken isimleri ingilizceydi ben Türkçeye çevirdim.
public class Main {
interface MerhabaDunya {
public void selamla();
public void biriniSelamla(String birisi);
}
public void merhabaSoyle() {
class IngilizceSelamla implements MerhabaDunya {
String isim = "world";
public void selamla() {
biriniSelamla("world");
}
public void biriniSelamla(String birisi) {
isim = birisi;
System.out.println("Hello " + isim);
}
}
MerhabaDunya ıngilizceSelamla = new IngilizceSelamla();
MerhabaDunya fransizcaSelamla = new MerhabaDunya() {
String isim = "tout le monde";
public void selamla() {
biriniSelamla("tout le monde");
}
public void biriniSelamla(String birisi) {
isim = birisi;
System.out.println("Salut " + isim);
}
};
MerhabaDunya ispanyolcaSelamla = new MerhabaDunya() {
String isim = "mundo";
public void selamla() {
biriniSelamla("mundo");
}
public void biriniSelamla(String birisi) {
isim = birisi;
System.out.println("Hola, " + isim);
}
};
ıngilizceSelamla.selamla();
fransizcaSelamla.biriniSelamla("Fred");
ispanyolcaSelamla.selamla();
}
public static void main(String... args) {
Main calis = new Main();
calis.merhabaSoyle();
}
}
Çıktısı;
Hello world
Salut Fred
Hola, mundo
İç içe sınıflar genel olarak bu şekilde. Umarım konu anlaşılmıştır. Anlamadığınız yerleri tekrar tekrar üstünden geçip inceleyin.
Eyvallah kral