2. bölüm Çok Şekillilik (polymorphism) - java günlüğüm · akın kaldıroğlu kasım 2015...
TRANSCRIPT
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