“A a = new B()” Ne Demektir?

Sosyal ortamların birinde bir genç bana “birde hocam sizden rica etsem bu kalitim konusunda upcasting ve downcasting neden kullaniliyor.Bunun hakkinda yazi yazarmisiniz turkce kaynagi hic yok nerdeyse bu konunun” diye bir mesaj göndermişti. Ben daha çevap veremeden benzer bir isteği email ile de yaptı. Gönderdiği email şöyle:

Hocam javada su olayi anlamadim

A a = new B()

burda nesne b sinifi turundedir vs diyorlar.Boyle olunca ne oluyorki ne degisiyor a. diyerek sadece b nin elemanlarinami ulasiyoruz yoksa hem A hem B mi bu olay kafami karistirdi bir aciklama getirirseniz cok memnun olacagim.

iyi gunler

Ben de kendisine hızlıca bir cevap yazdım ve bu cevabı burada paylaşmak istiyorum.

Sevgili Ömer,

Belli ki “A a = new B()”yi öğrenirken ezbere gitmişsin, hatta daha öncesi de ezbere gitmiş ki bunu anlamakta zorlanıyorsun.

Şöyle örnek vereyim:

A a = new B()” yerine sunu yazayım 

Calısan c1 = new Muhendis();

Bu su demektir, fabrikada calısan bir Muhendis’i al ona Calısan gibi davran. Belli ki MuhendisCalısan tipinin bir alt tipi. Yani her Muhendis, bir Calısan’dır. 

Mesela Patron diye bir sınıf olsa ve uzerinde banaBirCalısanCagırın diye metot olsa, ona Muhendis gecebilirsin. Cunku her Muhendis bir Calısandır. Yani

Patron sınıfında public void banaBirCalısanCagırın(Calısan c) metodunu soyle cağırabilirsin:

Muhendis m1 = new Muhendis(“Ahmet”);

parton.banaBirCalısanCagırın(m1);

Bu ne demek? Patronun cagrısına uyarak ona bir Muhendis gonderik. Patron itiraz edebilir mi? Edemez. Biz Muhendis yerine Sekreter de gönderebilirdik çünkü o da Calısan’dır. Yani

Sekreter s1 = new Sekreter(“Zeynep”);

patron.banaBirCalısanCagırın(s1);

gibi. Var mı problem buraya kadar?

Simdi eger Patron, çağırdıgı Calısana “calıs” dese, yani banaBirCalısanCagırın() metodunun içi yani implementationu şöyle olsa:

public void banaBirCalısanCagırın(Calısan c) {

   c.calıs();

}

Sence “c.calıs()” nasıl davranır. Hangi nesne gecilirse o çalısmaz mı? Eger geçilen nesne Muhendis ise onun uzerindeki calıs() calısır, Sekreter ise Sekreter üzerindeki calıs() calısır.

Dolayısıyla A a = new B(); yazıp ta a.f()  çağrısında B’nin üzerindeki f() çalışmasının sebebi bu kadar basittir: Çünkü hayat böyledir ve aksini düşünemeyiz 🙂 İyi ki böyle, yoksa hayatta hiç kimse çalışmazdı 🙂

Bu durumu iyice kavrayıp kavramadığını ölçmek istersen şu soruya “bilemeyiz” cevabını verinceye kadar düşün:

Patron sınıfındaki “public void banaBirCalısanCagırın(Calısan c)metoduna geçilen nesneyi eğer ben insan kaynaklarından alıp da geçersem, hangi Calısan nesnesinin calıs() metodu calısır?

Yani şu kodu yazarsam:

Ik ik = new IK();

Calısan c = ik.birCalısanGonder();

patron.banaBirCalısanCagırın(c);

Hangi calıs() metodu çalışır? CD1

Doğru cevap “yukarıdaki bilgiler ışığında bilemeyiz”dir.

Kolay gelsin.”

Yukarıdaki kurguyu daha iyi anlamak için yandaki kalıtım

yapısını gözümüzde canlandırmalıyız.

Toplam görüntülenme sayısı: 2324