“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 Muhendis, Calı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ısan‘dı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ısan‘a “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);
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ı: 2389