2. bölüm Çok Şekillilik (polymorphism) - java günlüğüm · akın kaldıroğlu kasım 2015...

Post on 07-May-2020

5 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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,akin@javaturk.orgadresindeniletiş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

top related