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
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
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
İç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
4www.javaturk.org
Upcasting (Yükseltme)
www.selso
ft.aca
demy
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
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
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
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
TestPayrollOffice.java
9www.javaturk.org
www.selso
ft.aca
demy
10www.javaturk.org
Çok Şekillilik (Polymorphism)
www.selso
ft.aca
demy
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
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
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
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
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
16www.javaturk.org
Polymorphic Metotlar
www.selso
ft.aca
demy
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
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
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
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
TestPolymorphism.java
21www.javaturk.org
www.selso
ft.aca
demy
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
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
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
TestHR.java
25www.javaturk.org
www.selso
ft.aca
demy
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
27www.javaturk.org
Binding
www.selso
ft.aca
demy
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
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
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
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
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
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
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
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
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
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
Test.javaØTest.java inbinding package.
38www.javaturk.org
www.selso
ft.aca
demy
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
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
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
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
43www.javaturk.org
Sonuçlar
www.selso
ft.aca
demy
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
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
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
47www.javaturk.org
Downcasting (Alçaltma)
www.selso
ft.aca
demy
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
Downcasting - IØPeki,üstbirtiptenolanbirreferansıyadanesneyi,alttiplerindenolanbirreferansaatayabilirmiyiz?ØVebuneişeyarar?
ØÜsttiptenolanbirreferansıyadanesneyialıponualttipindenbirreferansaatamayadowncasting (alçaltma)denir.
49www.javaturk.org
www.selso
ft.aca
demy
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
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
DowncastingExample.java
52www.javaturk.org
www.selso
ft.aca
demy
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
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
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
InstanceofExample.java
56www.javaturk.org
www.selso
ft.aca
demy
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
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
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
Ö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
61www.selsoft.academy
Ödevler
www.selso
ft.aca
demy
Ö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
Ödevler IIØ Yandakiyapıyıoluşturun.ØUpcasting vedowncasting ileinstanceof kullanacakşekildeRegistrationOfficemetotlarınıkurgulayın.
63www.javaturk.org
www.selso
ft.aca
demy