2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015...

63
Akın Kaldıroğlu www.javaturk.org Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism) www.selsoft.academy

Transcript of 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015...

Page 1: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Akın Kaldıroğluwww.javaturk.org

Kasım2015

Java ile Nesne Merkezli ve Fonksiyonel Programlama

2. BölümÇok Şekillilik (Polymorphism)

www.selso

ft.aca

demy

Page 2: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

KüçükAmaÖnemliBirKonuØ Budosyaveberaberindekitüm,dosya,kod,vb.eğitimmalzemelerinintüm

haklarıAkınKaldıroğlu’naaittir.Ø Bueğitimmalzemelerinikişiselbilgilenmevegelişiminizamacıyla

kullanabilirsinizveisteyenlerihttp://www.javaturk.orgadresineyönlendirip,bumalzemelerinengüncelhallerinialmalarınısağlayabilirsiniz.

Ø Yukarıdabahsedilenamaçdışında,bueğitimmalzemelerinin,ticariolsun/olmasınherhangibirşekilde,toplubireğitimfaaliyetindekullanılması,buamacayönelikolsun/olmasınbasılması,dağıtılması,gerçekyadasanal/Internetortamlarındayayınlanmasıyasaktır.Böylebirihtiyaçhalindelütfenbenimle,[email protected]şimegeçin.

Ø Buvebenzerieğitimmalzemelerinekatkıdabulunmakyadadüzeltmeveeleştirilerinizibanailetmekistersenizçoksevinirim.

Ø BolJava’lıgünlerdilerim.

2www.javaturk.org

www.selso

ft.aca

demy

Page 3: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

İçerikØBubölüm,nesne-merkezliprogramlamanınentemelkavramlarınolançokşekilliliği (polymorphism)elealacaktır.

ØJava’nıntipleriarasındakimümkündönüşümler(cast)incelenecektir.

3www.javaturk.org

www.selso

ft.aca

demy

Page 4: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

4www.javaturk.org

Upcasting (Yükseltme)

www.selso

ft.aca

demy

Page 5: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Upcasting - IØBirreferansıyadanesneyialıponuüsttipindenbirreferansaatamayaupcasting (yükseltme)denir.

ØUpcasting,yerinegeçebilmeözelliğindendolayıherzamangüvenlidir.ØDolayısıylacastoperatörü“()”kullanmayagerekyoktur.

5www.javaturk.org

Manager m = new Manager();Employee e = m;ya da doğrudanEmployee e = new Manager();Manager m = new Director();Emlpoyee e = new Director();

Referans

NesneU

pcas

ting

www.selso

ft.aca

demy

Page 6: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Upcasting - IIØHatırlayın,kalıtımbirgenelleştirme-özelleştirmeilişkisikurgular.

ØHiyerarşideaşağıdayeralanyanidahaözeltiplerdenolannesneler,yerinegeçebilme(substitutability)özelliğindendolayı,yukarıdayeralanyanidahagenelolantiplerinreferanslarınaatanabilir.

ØBudurumdaherözeltipinnesnesi,aynıhiyerarşidekidahageneltiptenolanreferanslaraatanabilir.

6www.javaturk.org

Employee e = new Employee();e = new Manager();e = new Director();Manager m = new Director();www.se

lsoft.a

cadem

y

Page 7: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

NedenUpcasting?ØDil,tabiatıitibariylegenelifadeleriledahaçokşeyanlatmaeğilimindedir.

ØUpcasting deprogramiçerisindedahagenelreferanslarla,hertürlüalttiptenolannesneyigöstermeyeteneğisağlar.ØEmployeeeifadesi“herhangibirçalışan”anlamınagelir.ØManagermifadeside“herhangibiryönetici”anlamınagelir.

ØBuiseprogramlarımızıbasitleştirir.

7www.javaturk.org

Employee e = new Employee();Manager m = new Manager();Director d = new Director();e = m;e = d;m = d;www.se

lsoft.a

cadem

y

Page 8: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

MetotParametrelerindeUpcastingØUpcasting,sıklıklametotparametrelerindedegörülür.ØBudurum,birmetoda,dahageneltiptenparametrealmasınarağmen,otipintümalttiplerindenparametregeçilerekçağrılmasıylaa oluşur.

ØpaySalary()metodunun,parametreolarakEmployee almasıdemek,kendisinehertürEmployee nesnesiningeçilebilmesidemektir.

8www.javaturk.org

public class PayrollOffice {public void paySalary(Employee e){double salary = e.calculateSalary();System.out.println("Paying a salary of " + salary +

" to " + e.getName());}

} www.selso

ft.aca

demy

Page 9: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

TestPayrollOffice.java

9www.javaturk.org

www.selso

ft.aca

demy

Page 10: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

10www.javaturk.org

Çok Şekillilik (Polymorphism)

www.selso

ft.aca

demy

Page 11: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Polymorphism- IØEskiYunanca’da poly çok,morph iseşekil demektir.ØPolymorphism deçokşekillilikdemektir.ØÇokşekilliolanisereferanslardır.ØPolymorphism,birreferansın,zamanınfarklıanlarında,kendiyadaalttiplerindenolanfarklınesnelerigösterebilmesinedenir.ØÖrnektekie vem referanslarıpolymorphictir.

11www.javaturk.org

Employee e = new Employee();Manager m = new Manager();Director d = new Director();e = m;e = d;m = d;www.se

lsoft.a

cadem

y

Page 12: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Polymorphism- IIØPolymorphism biryaklaşımdır,upcasting iseonugerçekleştirenmekanizmadır.

ØPolymorphismsayesindearayüzilegerçekleştirmeyiayırabiliriz.

ØReferans,üsttiptenolduğuiçinarayüzü,onaatanannesnelerise,alttiplerdenolabildiğinden,gerçekleştirmeyiifadeederler.

ØDolayısıyla,aynıarayüze sahipnesnelerarasında,nesneningerçektipinibilmeden,değişmeleryapabilirsiniz.

ØUnutmayın,birkalıtımhiyerarşisindekinesneler,enazındanenyukarıdakinesneninarayüzüne sahiptirler.

12www.javaturk.org

www.selso

ft.aca

demy

Page 13: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Polymorphism- IIIØBuyüzdenpolymorphismdahagüzelbirtanımla,ikireferansınbirbirleriylehaberleşip,birbirleriningerçektiplerinibilmemeleridemektir.

ØPayrollOffice nesnesisadeceEmployee nesnesinibilmekte,alttiplerini(Manager veDirector)isebilmemektedir.

13www.javaturk.org

www.selso

ft.aca

demy

Page 14: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Interface–Implementation Ayırımı- IØPolymorphismsayesindearayüzilegerçekleştirmeyiayırabiliriz.

ØÜsttiptenolanreferans,tipininarayüzünü,onaatanannesnelerisegerçekleştirmeyiifadeederler.

ØBuşekildegerçektehanginesneninkullanıldığınıbilmeden,sadeceüsttipeyaniarayüze bağlısınıflaryazılabilir.

Programto aninterfacenotanimplementation.ØYani,elinizdebirkalıtımhiyerarşisivarsa,kodunuzuohiyerarşininarayüzünübelirleyenenüsttipinegöreyazın,alttakisınıfları,gerçekleştirmeleri,gözönünealmayın.

ØBuşekildehiyerarşidekieklemeveçıkarmalardanetkilenmezsiniz.

14www.javaturk.org

www.selso

ft.aca

demy

Page 15: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Interface–Implementation Ayırımı- IIØPayrollOffice,Employeehiyerarşisindekideğişimlerdenetkilenmez,

ØÇünküPayrollOffice,sadeceEmployee’ninarayüzünübilmektedir.

15www.javaturk.org

www.selso

ft.aca

demy

Page 16: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

16www.javaturk.org

Polymorphic Metotlar

www.selso

ft.aca

demy

Page 17: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

PolymorphicMetotlar- IØPolymorphism,metotlariçindefarklıbiranlamasahiptir.

ØBirmetodunpolymorphic yaniçokşekilliolması,arayüzünün sabitolmasınarağmen,overriding sayesinde,pekçokgerçekleştirmeyesahipolmasıanlamınagelir.

ØDolayısıylafarklıgerçekleştirmeler,aynıarayüzünarkasındasaklanabilir,birbirleriyerinegeçecekşekildekullanılabilir.

17www.javaturk.org

www.selso

ft.aca

demy

Page 18: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

PolymorphicMetotlar- IIØBuhiyerarşidekiwork()metodunuelealalım.

ØBumetodunbirarayüzüolmasınakarşın5tanegerçekleştirmesivardır.

ØPekibirpolymorphicmetodunarayüzüilegerçekleştirmeleriarasındakiilişkinasıldır?

18www.javaturk.org

www.selso

ft.aca

demy

Page 19: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

PolymorphicMetotlar- IIIØBuhiyerarşidekiwork()metodufarklıreferanslarüzerindeçağrılırsa,hangigerçekleştirmelerçalışır?

ØBirmetodunarayüzü,ometodunkendisiüzerindeçağrıldığıreferansıntipitarafındanbelirlenir.

ØOmetodunhangigerçekleştirmesininçalışacağıisereferansıngösterdiğinesnetarafındanbelirlenir.

19www.javaturk.org

Employee e = new Employee();e.work();Manager m = new Manager();m.work();Director d = new Director();d.work();

Employee e = new Employee();e.work();e = new Manager();e.work();e = new Director();e.work();

www.selso

ft.aca

demy

Page 20: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Arayüz- GerçekleştirmeØEmployee tipindee referansıüzerindeçağrılabilecekolanmetotlarıbelirleyene’nintipiolanEmployee sınıfınınarayüzüdür.

ØAmaçalışmazamanında(run-time)hangiwork()metodununçağrılacağınıbelirleyenisee’ningösterdiğinesnenintipidir.

20www.javaturk.org

Employee e = new Employee();e.work(); => Employee’s work()e = new Manager();e.work() => Manager’s work()e = new Director();e.work(); => Director’s work()www.se

lsoft.a

cadem

y

Page 21: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

TestPolymorphism.java

21www.javaturk.org

www.selso

ft.aca

demy

Page 22: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

BaşkaBirAçıdanPolymorphism- IØDahaönce“birmetodunarayüzü,ometodunkendisiüzerindeçağrıldığıreferansıntipitarafındanbelirlenir.Ometodunhangigerçekleştirmesininçağrılacağı isereferansıngösterdiğinesnetarafındanbelirlenir.”dedik.

ØBudurumuşöyledeifadeedebiliriz:ØBirmetodunbirreferansüzerindeçağrılıpçağrılamayacağı,derlemezamanında(compile-time)belirlenir.Çünkübukarar,referansıntipinebakılarakalınır.Ø Referansın tipindeometotvarsaçağrılabiliryoksaçağrılamaz.

ØAmagerçektehangimetodunçağrılacağı,referansıngösterdiğinesneyebağlıolduğundanvebudaancakçalışmazamanındabelliolacağından,derlemezamanındabilinemez.

22www.javaturk.org

www.selso

ft.aca

demy

Page 23: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

BaşkaBirAçıdanPolymorphism- IIØAşağıdakikoddahangiwork()çağrılır?

23www.javaturk.org

HR hr = new HR();Employee e = hr.getAnEmployee();e.work(); => Hangi work() çağrılır?

public class HR{public Employee getAnEmployee(){...}

}

www.selso

ft.aca

demy

Page 24: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

BaşkaBirAçıdanPolymorphism- IIIØBusorununcevabı“bilinemez”dir.

ØKodabakarak,derlemezamanındaEmployee tipindenbirnesnedöndürdüğünügördüğümüzbirmetodun,gerçekteEmployee’nin hangialttipinidöndürdüğünükodabakarakbilmemizmümkündeğildir.

ØBubilgiancakçalışmazamanında,dönennesneningerçektipibilininceortayaçıkar.

24www.javaturk.org

www.selso

ft.aca

demy

Page 25: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

TestHR.java

25www.javaturk.org

www.selso

ft.aca

demy

Page 26: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

26www.javaturk.org

Employee e = new Manager();e.work(); Employee’nin

work() metodunun çağrılacağını düşnebilirsiniz!

Aslında çağrılan Manager’in work() metodudur!!!

www.selso

ft.aca

demy

Page 27: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

27www.javaturk.org

Binding

www.selso

ft.aca

demy

Page 28: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Bağlama(Binding)ØProgramlamadillerindebağlama(binding),değişken,metot,vb.özelliklerindilinelemanlarıylailişkilendirmesidir.ØÖrneğinJava’da“*”sembolününmatematikselçarpmaişleminebağlanmasıdilintasarımzamanındayapılmıştır.

ØDillerdetemeldeikibağlamazamanıönemlidir:ØStatikbağlama(static binding):Statikbağlamadaözelliklerin,dilinelemanlarıylailişkilendirmesiçalışmazamanındanönceyapılırveprogramınçalışmasısırasındadadeğişmez.

ØDinamic bağlama(dynamic binding):Dinamikbağlamadaiseözelliklerin,dilinelemanlarıylailişkilendirmesiçalışmazamanındayapılırveprogramınçalışmasısırasındadeğişebilir.

28www.javaturk.org

www.selso

ft.aca

demy

Page 29: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Method BindingØProgramlamadillerinde,operationların,metotlarabağlanmalarınadamethod binding (metotbağlama) denir.

ØNesnemerkezlidillerdedemetotlarınbağlanmasındadastatik vedinamik olmaküzereikifarklıbağlamasözkonusudur

ØMetotpolymorphismi,dynamic binding (dinamikbağlama)denenbirtekniklebaşarılır.

29www.javaturk.org

www.selso

ft.aca

demy

Page 30: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Operation veMethod Ayırımı- IØÖnceoperation (message)vemethod arasındakiayırımıaçıklayalım.

ØBuayırımnesne-merkezlidillerdesözkonusudur.

ØOperation (yadamessage)ilesoyutolarakyaniarayüzseviyesindebirreferansınüzerindeçağrılabilecekolandavranışlarkastedilir.

ØMethod isebirnesneninüzerindeçağrılandavranışınkendisidir.

ØOperation arayüz,metotisegerçekleştirmedemektir.

30www.javaturk.org

www.selso

ft.aca

demy

Page 31: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Operation veMethod Ayırımı- IIØOperation (yadamessage)dahaçokbirkalıtımhiyerarşisindebirdenfazlagerçekleştirmesiolanvehiyerarşininentepesindetanımlananmetodunarayüzünü,metotiseohiyerarşidekigerçekleştirmeleritemsileder.

ØBirhiyerarşidebiroperation amaooperationunbirdenfazlagerçekleştirmesiyanimetodubulunur.

ØOperation dahaçoktasarımvederlemezamanı,method isederlemeveçalışmazamanıyapısıdır.

31www.javaturk.org

www.selso

ft.aca

demy

Page 32: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

DinamikBağlama- IØDinamikbağlamadaherşeyçalışmazamanıtarafındanbelirlenir.

ØDinamikbağlamada,derleyicisadeceçağrılanmetodunarayüzüyanioperation seviyesindekontrolleryapabilir.ØMetodunarayüzü,üzerindeçağrıyapılanreferansıntipindevarmı?

ØMetodunarayüzüileçağrısıarasındabiruyumsuzlukvarmı?Ø Örneğin,isim,parametresayıvetipkontrolleri,dönüştipikontrolüvs.

32www.javaturk.org

www.selso

ft.aca

demy

Page 33: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

DinamikBağlama- IIØAmaderleyicioperationun gerçektehanginesneüzerindekigerçekleştirmesininçağrılacağınıbilemez.ØÇünkünesnebirçalışma-zamanıyapısıdır.

ØBubilgi,çalışmazamanındaüzerindemetotçağrısıyapılanreferansıngösterdiğinesneningerçektipiortayaçıkanakadarbilinemez.

ØNezamannesnebelliolur,ozamanonesneninüzerindekimetodunçağrılacağıbelliolur.

ØBuyüzdenbutürbağlamayalate binding (geçbağlama)denir.

33www.javaturk.org

www.selso

ft.aca

demy

Page 34: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Uygulama- IØShape sınıfınınentepedeolduğubirhiyerarşidüşünün.

ØShape‘in üzerindedraw(), erase(),calculateArea() vecalculateCircumference()metotlarıvardır.

ØCircle,Rectangle, Square veTriangle iseShape’in altsınıflarıdırvebumetotlarıoverrideederler.ØMetotlarıoverrideederkenmümkünse“super”i kullanın.

ØCanvas diyebirbaşkasınıfoluşturunveüzerineShape alan,drawShape(Shape s) veeraseShape(Shape s) metotlarınıkoyun.

34www.javaturk.org

www.selso

ft.aca

demy

Page 35: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Uygulama- IIØShapeFactory isimlibirbaşkasınıfınüzerindekicreateShape()isimlimetodundarandom olarakbirShapenesnesiyaratıpdöndürmesinisağlayın.

ØTestsınıfındadarandom Shape nesneleriüretip,Canvas’ınmetotlarınageçinvehangimetotlarınçağrıldığınıgözleyin.

35www.javaturk.org

www.selso

ft.aca

demy

Page 36: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

StatikBağlamaØStatikbağlamadaherşeyçalışmazamanındanöncebelirlenirveprogramınçalışmasısırasındadadeğişmez.ØMuhtemelenderleyicitarafındanbelirlenir.

ØStatikbağlananmetotlarise,bellektekikodlarınaderleyicitarafındanderlemezamanındabağlanır.

ØBuyüzdenbutürbağlanmayaearly binding (erkenbağlama)dadenir.

ØGenelolarakprosedürel dillerdekimetotlarınbağlanmalarıstatiktir.

36www.javaturk.org

www.selso

ft.aca

demy

Page 37: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Java’daMetotlarıStatikBağlama- IØJava’dastatic,private veyafinal olanmetotlarstatikolarakbağlanırlar.Ø static metotlar,nesneüzerindeçağrılmazlar,sınıfüzerindeçağrılırlar.Ø Buyüzdenoverrideedilemezler,polymorphicdeğildirlervebağlanmalarıdastatiktir.

Øprivatemetotlarzatendevralınmadığındanoverridedaedilemezlervebağlanmalarıstatiktir.

Ø final metotlardevralınırlaramaoverrideedilemezlervebağlanmalarıstatiktir.

ØJava’dasadeceoverrideedilenoperationların birdenfazlametoduolacağından,dinamikbağlanmalarısözkonusudur.

37www.javaturk.org

www.selso

ft.aca

demy

Page 38: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Test.javaØTest.java inbinding package.

38www.javaturk.org

www.selso

ft.aca

demy

Page 39: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Java’daMetotlarıStatikBağlama- IIØJava’dastatic,private veyafinal olanmetotlarstatikolarakbağlanırlar.

ØStatikbağlananmetotlar,dinamikbağlananmetotlaragöredahahızlıçalışmaeğilimindedirler.ØÇünküstatikbağlamaçalışmazamanındayapılacakişleriderlemezamanınaçeker.

ØBundandolayı,overrideedilmeyenmetotları“final”olarakişaretleyerekçalışmazamanıperformansınıarttıranaraçlarvardır.

39www.javaturk.org

www.selso

ft.aca

demy

Page 40: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

BindingTest.javaØKullandığınızIDE’nin yardımıyla,BindingTest.java’nınmainmetodundayapılan“e.work()”ve“boss.youWorkToo()“metodlarının “implementation”larını bulun.ØEclipse’te fareilemetodunüstünegelipCTRL(Win)yadaCMD(Mac)tuşlarınabasıp“OpenImplementation”u seçin.

ØHangimetodunstatik– dinamikbağlandığınıbelirleyin.

40www.javaturk.org

public class BindingTest {public static void main(String[] args) {

HR hr = new HR();Employee e = hr.getAnEmployee();e.work();

Boss boss = new Boss();boss.youWorkToo();

}} www.se

lsoft.a

cadem

y

Page 41: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Java’daMetotlarıStatikBağlama- IIIØJava’dastatic olanmetotlarstatikolarakbağlanırlar.

ØEğer,ebeveyndeolanstatikbirmetodualtsınıftatekrartanımlarsanızbuoverriding olmaz.ØBunagölgeleme (shadowing)denir.ØYani,altsınıftakimetot,ebeveyndendevralınanmetodugölgeler.

41www.javaturk.org

www.selso

ft.aca

demy

Page 42: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

DeğişkenBağlamaØJava’danesnevesınıfdeğişkenleridenesnelerestatikolarakbağlanırlar.

ØOverriding,sadecenesnemetotlarıiçingeçerlidir,değişkenleriçinsözkonusudeğildir.

ØEğer,ebeveyndeolanbirdeğişkeni(nesneyadastatikolsun)altsınıftatekrartanımlarsanızbuoverridingolmaz,gölgeleme (shadowing)olur.

42www.javaturk.org

www.selso

ft.aca

demy

Page 43: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

43www.javaturk.org

Sonuçlar

www.selso

ft.aca

demy

Page 44: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

NedenPolymorphism?ØPolymorphism,programlarınparçalarıarasındakibağımlılıklarıarayüzseviyesineçekerekdahakolaydeğiştirebilmeimkanısağlar.

ØPolymorphismsayesindearayüzilegerçekleştirmeyiayırabiliriz.

Programto aninterfacenotanimplementation.

ØVarolanhiyerarşiyeyapılacakdeğişiklikler,ohiyerarşiyientepedekisınıf(yaniarayüz)düzeyindebilenistemcisınıflarıetkilemez.

ØBupolymorphismin entemelartısıdır.

44www.javaturk.org

www.selso

ft.aca

demy

Page 45: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Polymorphismin BirSonucu- IØPolymorphismin negatiftarafıise,bahsedilenentemelartısınınbirsonucudur.

ØPolymorphismde altsınıflarınkendilerinehasözelliklerinikullanamayız.

ØÇünküpolymorphism,birhiyerarşidekinesneleri,hiyerarşininentepesindekinesnecinsindenifadeettiğinden,altsınıflarınnesneleridetepesınıfınnesnesiolarakgörülür.

ØBukalıtımınsağladığıgenelleştirme- özelleştirmeilişkisiüzerinebinaedilenpolymorphicdavranışınbirsonucudur.

45www.javaturk.org

www.selso

ft.aca

demy

Page 46: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Polymorphismin BirSonucu- IIØBirmetodunarayüzü,ometodunkendisiüzerindeçağrıldığıreferansıntipitarafındanbelirlenir.ØBundandolayıEmployee tipindekireferansınüzerindesadeceEmployee’nin arayüzündeki metotlarçağrılabilir.

ØOmetodunhangigerçekleştirmesininalınacağıisereferansıngösterdiğinesnetarafındanbelirlenir.

46www.javaturk.org

Employee e = new Employee();e.work();e = new Manager();e.work();e.manage(); => Derleme hatasıe = new Director();e.work();e.makeAStrategicPlan() => Derleme hatasıwww.se

lsoft.a

cadem

y

Page 47: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

47www.javaturk.org

Downcasting (Alçaltma)

www.selso

ft.aca

demy

Page 48: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Upcasting (Tekrar)ØBirreferansıyadanesneyialıponuüsttipindenbirreferansaatamayaupcasting (yükseltme)denir.

ØUpcasting,yerinegeçebilmeözelliğindendolayıherzamangüvenlidir.ØDolayısıylacastoperatörü“()”kullanmayagerekyoktur.

48www.javaturk.org

Manager m = new Manager();Employee e = m;ya da doğrudanEmployee e = new Manager();Manager m = new Director();Emlpoyee e = new Director();

Referans

Nesne/Referans

Upc

astin

g

www.selso

ft.aca

demy

Page 49: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Downcasting - IØPeki,üstbirtiptenolanbirreferansıyadanesneyi,alttiplerindenolanbirreferansaatayabilirmiyiz?ØVebuneişeyarar?

ØÜsttiptenolanbirreferansıyadanesneyialıponualttipindenbirreferansaatamayadowncasting (alçaltma)denir.

49www.javaturk.org

www.selso

ft.aca

demy

Page 50: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Downcasting - IIØJava,üsttiptenolanbirreferansıyadanesneyialıponualttipindenbirreferansaatamayaizinvermez,derlemehatasıverir.ØButürdenatamayayanidowncastingeancakcast operatörü “()”ileizinverir.

ØCastoperatörüiçindehedeftipbulunur.

50www.javaturk.orgReferans

Nesne ya da Referans

Dow

ncas

ting

Employee e = new Employee();Manager m = e; // Derleyici hatasıManager m = (Manager) e; // Problem!m.manage();Director d = (Director)new Manager();Director d = (Director)new Employee();www.se

lsoft.a

cadem

y

Page 51: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Downcasting - IIIØCastoperatörükullanarakçevrimezorlamak,derleyicihatasınıgideriramaçalışmazamanındahalagerçeknesneninçevrilentipeuygunolmamamariskivardır.

ØEğercastedilennesneyadareferansıngösterdiğinesne,hedeftiptenyadaonunalttipindendeğilse,budurumdaçalışmazamanındajava.lang.ClassCastException sıradışıdurumuoluşur.

51www.javaturk.org

Employee e = new Manager();Manager m = (Manager) e; // Gerçek tipe geri dönüş

Employee e = new Employee();Manager m = (Manager) e; // ClassCastException!Director d = (Director) new Manager(); // ClassCastException!Director d = (Director) new Employee();// ClassCastException!www.se

lsoft.a

cadem

y

Page 52: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

DowncastingExample.java

52www.javaturk.org

www.selso

ft.aca

demy

Page 53: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Downcasting - IVØDowncast işlemineçoğunlukla,üsttiptenbirreferansdöndürenmetotçağrılarındansonraihtiyaçduyulur.

ØCastoperatörükullanarakçevrimyaparken,çevriminuygunbirtipeyapılmamasıihtimalindendolayıClassCastExceptionsıradışıdurumufırlatılabilir.

53www.javaturk.org

HR hr = new HR();Employee e = hr.getAnEmployee(); // Exact type of the returned object is not known!

Director d = (Director) e; // Risk of ClassCastException!d.makeAStrategicPlan();

www.selso

ft.aca

demy

Page 54: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

ClassCastExceptionØClassCastException,java.lang paketindekisıradışıdurumsınıflarındanbirisidir.

ØBirnesne,nesnesiolmadığı,kenditipininalttiplerindenbirineçevrilmeyeçalışıldığındafırlatılır.

54www.javaturk.org

www.selso

ft.aca

demy

Page 55: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

instanceof OperatörüØCastoperatörükullanarakçevrimyaparken,çevriminuygunbirtipeyapılmamasındandoğacakClassCastException sıradışıdurumunuönlemeninyöntemi,instanceofoperatörüdür.

Ø instanceof operatörüsağavesolabirertaneolmaküzereikitaneoperand alırveboolean döndürür:ØSoldakitestedilecekreferans,sağdakiisehedeftiptir.

55www.javaturk.org

Employee e = new Employee();if(e instanceof Manager){

Manager m = (Manager) e;}Director d = (Director)new Manager();Director d = (Director)new Employee();www.se

lsoft.a

cadem

y

Page 56: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

InstanceofExample.java

56www.javaturk.org

www.selso

ft.aca

demy

Page 57: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Upcasting vs.Downcasting - IØUpcasting,tümnesneleri,ebeveynleritipindengörmemiziveonlarasankiebeveynmişgibidavranmamızısağlar.

ØUpcastingin negatiftarafıise,üsttiplerdenreferanslarlagösterilennesnelerin,ebeveynlerindeolmayan,kendilerinehasolanözelliklerinikaybetmeleridir.

ØÇünkübirnesneninüzerindeerişilebilecekolanözellikleri,onesneninreferansınıntipibelirler.ØReferansüsttiptenolduğuiçinreferansınarayüzü,gerçeknesneninarayüzünden dahadardır(extends anahtarkelimesi!)

57www.javaturk.org

www.selso

ft.aca

demy

Page 58: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Upcasting vs.Downcasting - IIØDolayısıylaupcasting,nesneleritektipleştirir,farklılıklarınıortadankaldırır.ØFarklıözellikleresahipolannesneler,aynıreferansaatandığında,arayüzleriaynileşir vereferansınarayüzüne iner.

ØDowncasting isebuşekildekendinehasolanözelliklerini,üsttiptenreferansaatanmasındandolayıkaybetmişolannesnelere,varolanözelliklerinigerikazandırır.

ØUpcasting iletektipleşmişolannesneler,downcasting iletabiricaizsekendilerinegelirler,tümözelliklerinigösterebilirler.

58www.javaturk.org

www.selso

ft.aca

demy

Page 59: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

TestPayrollOffice.javaØTestPayrollOffice.java’yı çalıştırmadanöncePayrollOfice.java’daki paySalary(Employee e)metodunudeğiştirin.

59www.javaturk.org

www.selso

ft.aca

demy

Page 60: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

ÖzetØBubölümde,çokşekillilik (polymorphism)elealındır.

ØReferanslarvemetotlarınpolymorphicdavranışlarıincelendi.

ØTiplerarasındakiupcasting vedowncasting çevrimleri(conversion)elealındı.

Ø instanceof operatörüileRunTime Type Identification (RTTI)işlendi.

60www.selsoft.academy

www.selso

ft.aca

demy

Page 61: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

61www.selsoft.academy

Ödevler

www.selso

ft.aca

demy

Page 62: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Ödevler IØDahaönceoluşturduğunuzShape hiyerarşisinielealın.

ØCanvas sınıfınınüzerindevarolandrawShape() veeraseShape()metotlarındaçizilenyadasilinennesneningerçektipinegöreyarıçapını,kenarlarınıveyüksekliğinikonsolayazın.

62www.javaturk.org

www.selso

ft.aca

demy

Page 63: 2. Bölüm Çok Şekillilik (Polymorphism) - Java Günlüğüm · Akın Kaldıroğlu Kasım 2015 Java ile Nesne Merkezli ve Fonksiyonel Programlama 2. Bölüm Çok Şekillilik (Polymorphism)

Ödevler IIØ Yandakiyapıyıoluşturun.ØUpcasting vedowncasting ileinstanceof kullanacakşekildeRegistrationOfficemetotlarınıkurgulayın.

63www.javaturk.org

www.selso

ft.aca

demy