“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ı: 2382
yusuf
01 Mayıs 2015 @ 10:12
InsanKaynaklarI sinifidan gelen calisan in calis (); metodu calismali
Akin
01 Mayıs 2015 @ 11:01
Doğru açıklama bu. Ben bu durumu “bilemeyiz” diye açıklıyorum. Yani İnsanKaynakları sınıfındaki o metodun koduna bakmamız gerekir. Kaldı ki burada baksak ta ancak oalsılıklardan bahsedebiliriz.
Tesekkurler.
selim
02 Mayıs 2015 @ 03:27
metodAdi(new nesne);
Akın bey daha önce bu şekilde bir kullanımda görmüştüm bunuda açıklayabilirmisiniz acaba.
Akin
02 Mayıs 2015 @ 08:36
Aslında aynı şey. “A a = new B()” demek ile “metodAdi(A a)” şeklindeki bir metoda B nesnesini doğrudan “x.metodAdi(new B())” şeklinde geçmek aynı şeyler.
Teşekkürler.
hakan
04 Mayıs 2015 @ 10:41
Ben aslında java ve/veya C# eğitimlerinden önce alt seviyeli programlama ve sistem programlama eğitiminin verilmesi, java eğitiminde sistemde olan bitenin sembolik resminin çizilerek anlatılması gerektiğini düşünüyorum…
Akin
04 Mayıs 2015 @ 13:40
Haklı olabilirsiniz Hakan bey. Sizin gibi dusunen universiteler var ama gittikce azalıyorlar.
Resimlerden faydalanmak onemli ama resim cizmek maliyetli, çok zaman alıyor. Ben şahsen yazılarımda UML cizimlerini koyuyorum ama siz daha temel seviyede vizimlerden bahsediyorsunuz sanırım.
Tesekkurler.
Erhun
04 Mayıs 2015 @ 14:57
Merhaba Akin Bey;
Anlatim icin tesekkurler, anlasilir sade bir dil, ancak ornek kod da yer alan birCalısanGonder metodu InsanKaynkalari sinif diyagraminda yer almamis bunu yerine banaBirCalisanVer adinda bir metod var, kafa karistirici olabilir diye dusundum.
Akin
05 Mayıs 2015 @ 00:06
Teşekkür ederim, haklısınız, düzelttim.
hakan
06 Mayıs 2015 @ 13:44
Evet Akın Bey, daha temel seviyede mesela bellekte A sınıf örneğini, B sınıf örneğini temsil eden basit kutucuklar gibi 🙂 Ve olayların gelişimini bunun üzerinden yeni çizimlerle anlatmak gibi…
Öte yandan evet bu anlatım tarzı daha uzundur ama daha sağlamdır. Ezber bilgilerden daha uzak temel mantıklara daha yakındır bence..
Üniversitelerin eğitimine gelince bilim yapma/üretme kurumları bilim öğretmek/öğrenmek evrensel amacından koparılıp piyasa için eğitim mantığına yaklaştıkça bahsettiğiniz türde eğitim veren üniversitelerin sayılarının artması gayet doğal ama ne kadar doğru olduğu çok tartışılır!
Akin
07 Mayıs 2015 @ 00:08
Ben sınıf ici eğitimelrde, nesne ve referans kavramlarını acıkalrken, ya da initialization order gibi konuları acıklarken tahtaya sık sık tahtaya “RAM’in içini” gosteren resimcikler çiziyorum.
Ben ABD’deki universitelerde hangi diller ogretiliyor, ozellikle giris seviyesinde diye ufak bir arastırma yapmıstım ve sunum olarak burada da yayınladım. Python ve Java ağırlıkta gorunuyor. Stanford, MIT vb. okulların seçimleri bunlar. Bu okullar giriş anlamında daha rahat anlasıldıgı icin bu dilleri tercih ediyorlar. Nihayetinde hepsi C/C++ gibi dillerin kulanılmasını sağlıyor okul boyunca. Dolayısıyal Java ve Python gibi dillere yonelmeyi sadece ticarilesmeyle acıklamak ne kadar dogrudur bilmiyorum.
Tesekkur ederim hakan bey.
Mehmet
07 Mayıs 2015 @ 08:56
Sade ve kolay bir anlatım dili ile çok güzel özetlemişsiniz konuyu, teşekkürler:)
hakan
08 Mayıs 2015 @ 08:02
Aslında ben ABD’yi değil Türkiye’deki durumu ifade etmeye çalışmıştım. Anlatmaya çalıştığım durumu ve üniversite eğtim düzeyini Prof. A.M. Celal Şengör Türkiye’de gerçek manada bir üniversite yok diyerek ifade ediyor
Akin
09 Mayıs 2015 @ 16:30
Teşekkürler Mehmet 🙂
Akin
09 Mayıs 2015 @ 16:34
Anladım Hakan bey, bunda haklısınız.
Prof. Dr. Celal Şengör’ü aşırı pozitivist görüşlerinden dolayı genelde beğenmesem de bu söylediği çok temel bir gerçek. Ülkemizdeki üniversiteler “yüksek lise” düzeyinde eğitim veriyorlar. Genel olarak eğitim ve öğretim anlayışı olarak liseden tek farkları yok, sadece lisenin devamı gibi davranıyorlar. Malesef durum bu.
Teşekkürler.
binnur kurt
03 Haziran 2015 @ 02:59
soyut düşünme konusunda genel olarak başarısız.
bebeklikten itibaren öğrenme dış dünyayı duyu organları ile algılayarak başladığı ve devam ettiği için mutlaka A yerine Calisan ve B yerine Muhendis koymak gerekiyor! Yoksa anlamıyoruz!
Küme kuramını, saymayı bile bir önceki yüzyılın başında sorunsuz bir temele oturtabildik!
Yazılım da soyut bir varlık. Onu da anlamakta/anlatmakta zorlanıyoruz.
İyi okumalar:
Matematik ve Gerçek
https://nesinyayinevi.com/kitap.php?no=83
Akin
03 Haziran 2015 @ 11:12
Aynen öyle. Sonra da matematik gerekli mi?
Birebir muhatap olduğum kişilerde, özellikle eğitim sırasında mesela, kimin ne kadar soyutlama gücüne sahip olduğu çok açık bir şekilde ortaya çıkıyor.
Sagol Binnur.