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

Transkript

2. Bölüm Çok Şekillilik (Polymorphism)
y
ca
de
m
Java ile Nesne Merkezli ve Fonksiyonel
Programlama
w
w
w
.s
el
so
f
t.a
2. Bölüm
Çok Şekillilik (Polymorphism)
Akın Kaldıroğlu
www.javaturk.org
Kasım2015
ca
de
m
y
KüçükAmaÖnemliBirKonu
Ø Budosyaveberaberindekitüm,dosya,kod,vb.eğitimmalzemelerinintüm
w
Ø
w
Ø
w
.s
el
so
f
Ø
t.a
Ø
haklarıAkınKaldıroğlu’naaittir.
Bueğitimmalzemelerinikişiselbilgilenmevegelişiminizamacıyla
kullanabilirsinizveisteyenlerihttp://www.javaturk.org adresineyönlendirip,
bumalzemelerinengüncelhallerinialmalarınısağlayabilirsiniz.
Yukarıdabahsedilenamaçdışında,bueğitimmalzemelerinin,ticari
olsun/olmasınherhangibirşekilde,toplubireğitimfaaliyetindekullanılması,
buamacayönelikolsun/olmasınbasılması,dağıtılması,gerçekyada
sanal/Internetortamlarındayayınlanmasıyasaktır.Böylebirihtiyaçhalinde
lütfenbenimle,[email protected] adresindeniletişimegeçin.
Buvebenzerieğitimmalzemelerinekatkıdabulunmakyadadüzeltmeve
eleştirilerinizibanailetmekistersenizçoksevinirim.
BolJava’lıgünlerdilerim.
www.javaturk.org
2
ca
de
m
y
İçerik
Ø Bubölüm,nesne-merkezliprogramlamanınentemel
kavramlarınolançokşekilliliği (polymorphism)elealacaktır.
w
w
w
.s
el
so
f
t.a
Ø Java’nıntipleriarasındakimümkündönüşümler(cast)
incelenecektir.
www.javaturk.org
3
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Upcasting (Yükseltme)
www.javaturk.org
4
ca
de
m
y
Upcasting - I
Upcasting
Referans
el
so
f
t.a
Ø Birreferansıyadanesneyialıponu
üsttipindenbirreferansaatamaya
upcasting (yükseltme)denir.
Ø Upcasting,yerinegeçebilme
özelliğindendolayıherzaman
güvenlidir.
Ø Dolayısıylacastoperatörü“()”
kullanmayagerekyoktur.
Nesne
w
w
w
.s
Manager m = new Manager();
Employee e = m;
ya da doğrudan
Employee e = new Manager();
Manager m = new Director();
Emlpoyee e = new Director();
www.javaturk.org
5
ca
de
m
y
Upcasting - II
w
.s
el
so
f
t.a
Ø Hatırlayın,kalıtımbirgenelleştirme-özelleştirmeilişkisi
kurgular.
Ø Hiyerarşideaşağıdayeralanyanidahaözeltiplerdenolan
nesneler,yerinegeçebilme(substitutability)özelliğinden
dolayı,yukarıdayeralanyanidahagenelolantiplerin
referanslarınaatanabilir.
Ø Budurumdaherözeltipinnesnesi,aynıhiyerarşidekidaha
geneltiptenolanreferanslaraatanabilir.
w
w
Employee e = new Employee();
e = new Manager();
e = new Director();
Manager m = new Director();
www.javaturk.org
6
y
ca
de
m
NedenUpcasting?
el
so
f
t.a
Ø Dil,tabiatıitibariylegenelifadeleriledahaçokşeyanlatma
eğilimindedir.
Ø Upcasting deprogramiçerisindedahagenelreferanslarla,
hertürlüalttiptenolannesneyigöstermeyeteneğisağlar.
Ø Employee eifadesi“herhangibirçalışan”anlamınagelir.
Ø Managermifadeside“herhangibiryönetici”anlamınagelir.
Ø Buiseprogramlarımızıbasitleştirir.
w
w
w
.s
Employee e = new Employee();
Manager m = new Manager();
Director d = new Director();
e = m;
e = d;
m = d;
www.javaturk.org
7
ca
de
m
y
MetotParametrelerindeUpcasting
el
so
f
t.a
Ø Upcasting,sıklıklametotparametrelerindedegörülür.
Ø Budurum,birmetoda,dahageneltiptenparametre
almasınarağmen,otipintümalttiplerindenparametre
geçilerekçağrılmasıylaa oluşur.
Ø paySalary()metodunun,parametreolarakEmployee alması
demek,kendisinehertürEmployee nesnesinin
geçilebilmesidemektir.
w
w
w
.s
public class PayrollOffice {
public void paySalary(Employee e){
double salary = e.calculateSalary();
System.out.println("Paying a salary of " + salary +
" to " + e.getName());
}
}
www.javaturk.org
8
y
w
w
w
.s
el
so
f
t.a
ca
de
m
TestPayrollOffice.java
www.javaturk.org
9
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Çok Şekillilik (Polymorphism)
www.javaturk.org
10
y
ca
de
m
Polymorphism- I
Ø EskiYunanca’da poly çok,morph iseşekil demektir.
t.a
Ø Polymorphism deçokşekillilik demektir.
Ø Çokşekilliolanisereferanslardır.
el
so
f
Ø Polymorphism,birreferansın,zamanınfarklıanlarında,
kendiyadaalttiplerindenolanfarklınesneleri
gösterebilmesinedenir.
Ø Örnektekie vem referanslarıpolymorphictir.
w
w
w
.s
Employee e = new Employee();
Manager m = new Manager();
Director d = new Director();
e = m;
e = d;
m = d;
www.javaturk.org
11
y
ca
de
m
Polymorphism- II
t.a
Ø Polymorphism biryaklaşımdır,upcasting iseonu
gerçekleştirenmekanizmadır.
Ø Polymorphismsayesindearayüzilegerçekleştirmeyi
ayırabiliriz.
w
w
w
.s
el
so
f
Ø Referans,üsttiptenolduğuiçinarayüzü,onaatanan
nesnelerise,alttiplerdenolabildiğinden,gerçekleştirmeyi
ifadeederler.
Ø Dolayısıyla,aynıarayüze sahipnesnelerarasında,nesnenin
gerçektipinibilmeden,değişmeleryapabilirsiniz.
Ø Unutmayın,birkalıtımhiyerarşisindekinesneler,enazından
enyukarıdakinesneninarayüzüne sahiptirler.
www.javaturk.org
12
y
so
f
t.a
Ø Buyüzdenpolymorphism
dahagüzelbirtanımla,iki
referansınbirbirleriyle
haberleşip,birbirlerinin
gerçektiplerinibilmemeleri
demektir.
ca
de
m
Polymorphism- III
w
w
w
.s
el
Ø PayrollOffice nesnesi
sadeceEmployee nesnesini
bilmekte,alttiplerini
(Manager veDirector)ise
bilmemektedir.
www.javaturk.org
13
ca
de
m
y
Interface–Implementation Ayırımı- I
w
w
w
.s
el
so
f
t.a
Ø Polymorphismsayesindearayüzilegerçekleştirmeyi
ayırabiliriz.
Ø Üsttiptenolanreferans,tipininarayüzünü,onaatanan
nesnelerisegerçekleştirmeyiifadeederler.
Ø Buşekildegerçektehanginesneninkullanıldığınıbilmeden,
sadeceüsttipeyaniarayüze bağlısınıflaryazılabilir.
Programto aninterfacenotanimplementation.
Ø Yani,elinizdebirkalıtımhiyerarşisivarsa,kodunuzuo
hiyerarşininarayüzünübelirleyenenüsttipinegöreyazın,
alttakisınıfları,gerçekleştirmeleri,gözönünealmayın.
Ø Buşekildehiyerarşidekieklemeveçıkarmalardan
etkilenmezsiniz.
www.javaturk.org
14
ca
de
m
y
Interface–Implementation Ayırımı- II
so
f
t.a
Ø PayrollOffice,
Employee
hiyerarşisindeki
değişimlerden
etkilenmez,
w
w
w
.s
el
Ø ÇünküPayrollOffice,
sadeceEmployee’nin
arayüzünü
bilmektedir.
www.javaturk.org
15
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Polymorphic Metotlar
www.javaturk.org
16
y
ca
de
m
PolymorphicMetotlar- I
Ø Polymorphism,metotlariçindefarklıbiranlamasahiptir.
so
f
t.a
Ø Birmetodunpolymorphic yaniçokşekilliolması,
arayüzünün sabitolmasınarağmen,overriding sayesinde,
pekçokgerçekleştirmeyesahipolmasıanlamınagelir.
w
w
w
.s
el
Ø Dolayısıylafarklıgerçekleştirmeler,aynıarayüzünarkasında
saklanabilir,birbirleriyerinegeçecekşekildekullanılabilir.
www.javaturk.org
17
y
t.a
w
w
w
.s
el
so
f
Ø Buhiyerarşideki
work()metodunuele
alalım.
Ø Bumetodunbir
arayüzüolmasına
karşın5tane
gerçekleştirmesi
vardır.
Ø Pekibirpolymorphic
metodunarayüzüile
gerçekleştirmeleri
arasındakiilişki
nasıldır?
ca
de
m
PolymorphicMetotlar- II
www.javaturk.org
18
y
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();
w
w
w
.s
el
so
f
t.a
Ø Buhiyerarşidekiwork()
metodufarklıreferanslar
üzerindeçağrılırsa,hangi
gerçekleştirmelerçalışır?
Ø Birmetodunarayüzü,o
metodunkendisiüzerinde
çağrıldığıreferansıntipi
tarafındanbelirlenir.
Ø Ometodunhangi
gerçekleştirmesinin
çalışacağıisereferansın
gösterdiğinesne
tarafındanbelirlenir.
ca
de
m
PolymorphicMetotlar- III
www.javaturk.org
19
y
ca
de
m
Arayüz- Gerçekleştirme
so
f
t.a
Ø Employee tipindee referansıüzerindeçağrılabilecekolan
metotlarıbelirleyene’nintipiolanEmployee sınıfının
arayüzüdür.
Ø Amaçalışmazamanında(run-time)hangiwork()
metodununçağrılacağınıbelirleyenisee’ningösterdiği
nesnenintipidir.
w
w
w
.s
el
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.javaturk.org
20
y
w
w
w
.s
el
so
f
t.a
ca
de
m
TestPolymorphism.java
www.javaturk.org
21
ca
de
m
y
BaşkaBirAçıdanPolymorphism- I
Ø
w
.s
el
so
f
t.a
Ø Dahaönce“birmetodunarayüzü,ometodunkendisi
üzerindeçağrıldığıreferansıntipitarafındanbelirlenir.O
metodunhangigerçekleştirmesininçağrılacağıise
referansı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ın
w
w
gösterdiğinesneyebağlıolduğundanvebudaancakçalışma
zamanındabelliolacağından,derlemezamanındabilinemez.
www.javaturk.org
22
ca
de
m
y
BaşkaBirAçıdanPolymorphism- II
Ø Aşağıdakikoddahangiwork()çağrılır?
el
so
f
t.a
public class HR{
public Employee getAnEmployee(){...}
}
w
w
w
.s
HR hr = new HR();
Employee e = hr.getAnEmployee();
e.work();
=> Hangi work() çağrılır?
www.javaturk.org
23
ca
de
m
y
BaşkaBirAçıdanPolymorphism- III
Ø Busorununcevabı“bilinemez”dir.
el
so
f
t.a
Ø Kodabakarak,derlemezamanındaEmployee tipindenbir
nesnedöndürdüğünügördüğümüzbirmetodun,gerçekte
Employee’nin hangialttipinidöndürdüğünükodabakarak
bilmemizmümkündeğildir.
w
w
w
.s
Ø Bubilgiancakçalışmazamanında,dönennesneningerçek
tipibilininceortayaçıkar.
www.javaturk.org
24
w
w
w
.s
el
so
f
t.a
ca
de
m
y
TestHR.java
www.javaturk.org
25
y
Employee e = new Manager();
e.work();
w
w
w
.s
Aslında çağrılan
Manager’in work()
metodudur!!!
el
so
f
t.a
ca
de
m
Employee’nin
work() metodunun
çağrılacağını
düşnebilirsiniz!
www.javaturk.org
26
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Binding
www.javaturk.org
27
y
ca
de
m
Bağlama(Binding)
w
w
w
.s
el
so
f
t.a
Ø Programlamadillerindebağlama(binding),değişken,
metot,vb.özelliklerindilinelemanlarıylailişkilendirmesidir.
Ø ÖrneğinJava’da“*”sembolününmatematikselçarpma
işleminebağlanmasıdilintasarımzamanındayapılmıştır.
Ø Dillerdetemeldeikibağlamazamanıönemlidir:
Ø Statikbağlama(static binding):Statikbağlamadaözelliklerin,
dilinelemanlarıylailişkilendirmesiçalışmazamanındanönce
yapılırveprogramınçalışmasısırasındadadeğişmez.
Ø Dinamic bağlama(dynamic binding):Dinamikbağlamadaise
özelliklerin,dilinelemanlarıylailişkilendirmesiçalışma
zamanındayapılırveprogramınçalışmasısırasındadeğişebilir.
www.javaturk.org
28
ca
de
m
y
Method Binding
Ø Programlamadillerinde,operationların,metotlara
bağlanmalarınadamethod binding (metotbağlama) denir.
el
so
f
t.a
Ø Nesnemerkezlidillerdedemetotlarınbağlanmasındada
statik vedinamik olmaküzereikifarklıbağlamasöz
konusudur
w
w
w
.s
Ø Metotpolymorphismi,dynamic binding (dinamikbağlama)
denenbirtekniklebaşarılır.
www.javaturk.org
29
ca
de
m
y
Operation veMethod Ayırımı- I
t.a
Ø Önceoperation (message)vemethod arasındakiayırımı
açıklayalım.
Ø Buayırımnesne-merkezlidillerdesözkonusudur.
so
f
Ø Operation (yadamessage)ilesoyutolarakyaniarayüz
w
w
.s
el
seviyesindebirreferansınüzerindeçağrılabilecekolan
davranışlarkastedilir.
Ø Method isebirnesneninüzerindeçağrılandavranışın
kendisidir.
w
Ø Operation arayüz,metotisegerçekleştirmedemektir.
www.javaturk.org
30
ca
de
m
y
Operation veMethod Ayırımı- II
t.a
Ø Operation (yadamessage)dahaçokbirkalıtımhiyerarşisinde
birdenfazlagerçekleştirmesiolanvehiyerarşininentepesinde
tanımlananmetodunarayüzünü,metotiseohiyerarşideki
gerçekleştirmeleritemsileder.
el
so
f
Ø Birhiyerarşidebiroperation amaooperationun birdenfazla
gerçekleştirmesiyanimetodubulunur.
w
w
w
.s
Ø Operation dahaçoktasarımvederlemezamanı,method ise
derlemeveçalışmazamanıyapısıdır.
www.javaturk.org
31
y
ca
de
m
DinamikBağlama- I
Ø Dinamikbağlamadaherşeyçalışmazamanıtarafından
belirlenir.
Örneğin,isim,parametresayıvetipkontrolleri,dönüştipikontrolü
vs.
w
w
Ø
w
.s
el
so
f
t.a
Ø Dinamikbağlamada,derleyicisadeceçağrılanmetodun
arayüzüyanioperation seviyesindekontrolleryapabilir.
Ø Metodunarayüzü,üzerindeçağrıyapılanreferansıntipinde
varmı?
Ø Metodunarayüzüileçağrısıarasındabiruyumsuzlukvarmı?
www.javaturk.org
32
y
ca
de
m
DinamikBağlama- II
t.a
Ø Amaderleyicioperationun gerçektehanginesneüzerindeki
gerçekleştirmesininçağrılacağınıbilemez.
Ø Çünkünesnebirçalışma-zamanıyapısıdır.
el
so
f
Ø Bubilgi,çalışmazamanındaüzerindemetotçağrısıyapılan
referansıngösterdiğinesneningerçektipiortayaçıkana
kadarbilinemez.
w
w
w
.s
Ø Nezamannesnebelliolur,ozamanonesneninüzerindeki
metodunçağrılacağıbelliolur.
Ø Buyüzdenbutürbağlamayalate binding (geçbağlama)
denir.
www.javaturk.org
33
ca
de
m
y
Uygulama- I
t.a
Ø Shape sınıfınınentepedeolduğubirhiyerarşidüşünün.
Ø Shape‘in üzerindedraw(), erase(),calculateArea() ve
calculateCircumference()metotlarıvardır.
w
.s
el
so
f
Ø Circle,Rectangle, Square veTriangle iseShape’in alt
sınıflarıdırvebumetotlarıoverrideederler.
Ø Metotlarıoverrideederkenmümkünse“super”i kullanın.
w
w
Ø Canvas diyebirbaşkasınıfoluşturunveüzerineShape alan,
drawShape(Shape s) veeraseShape(Shape s) metotlarını
koyun.
www.javaturk.org
34
ca
de
m
y
Uygulama- II
t.a
Ø ShapeFactory isimlibirbaşkasınıfınüzerindeki
createShape()isimlimetodundarandom olarakbirShape
nesnesiyaratıpdöndürmesinisağlayın.
w
w
w
.s
el
so
f
Ø Testsınıfındadarandom Shape nesneleriüretip,Canvas’ın
metotlarınageçinvehangimetotlarınçağrıldığınıgözleyin.
www.javaturk.org
35
ca
de
m
y
StatikBağlama
t.a
Ø Statikbağlamadaherşeyçalışmazamanındanönce
belirlenirveprogramınçalışmasısırasındadadeğişmez.
Ø Muhtemelenderleyicitarafındanbelirlenir.
el
so
f
Ø Statikbağlananmetotlarise,bellektekikodlarınaderleyici
tarafındanderlemezamanındabağlanır.
w
.s
Ø Buyüzdenbutürbağlanmayaearly binding (erken
bağlama)dadenir.
w
w
Ø Genelolarakprosedürel dillerdekimetotlarınbağlanmaları
statiktir.
www.javaturk.org
36
ca
de
m
y
Java’daMetotlarıStatikBağlama- I
Buyüzdenoverrideedilemezler, polymorphicdeğildirlerve
bağlanmalarıdastatiktir.
so
f
Ø
t.a
Ø Java’dastatic,private veyafinal olanmetotlarstatikolarak
bağlanırlar.
Ø static metotlar,nesneüzerindeçağrılmazlar,sınıfüzerinde
çağrılırlar.
Ø private metotlarzatendevralınmadığındanoverrideda
w
.s
el
edilemezlervebağlanmalarıstatiktir.
Ø final metotlardevralınırlaramaoverrideedilemezlerve
bağlanmalarıstatiktir.
w
w
Ø Java’dasadeceoverrideedilenoperationların birdenfazla
metoduolacağından,dinamikbağlanmalarısözkonusudur.
www.javaturk.org
37
w
w
w
.s
el
so
f
t.a
Ø Test.java inbinding package.
ca
de
m
y
Test.java
www.javaturk.org
38
ca
de
m
y
Java’daMetotlarıStatikBağlama- II
Ø Java’dastatic,private veyafinal olanmetotlarstatikolarak
bağlanırlar.
w
.s
el
so
f
t.a
Ø Statikbağlananmetotlar,dinamikbağlananmetotlaragöre
dahahızlıçalışmaeğilimindedirler.
Ø Çünküstatikbağlamaçalışmazamanındayapılacakişleri
derlemezamanınaçeker.
w
w
Ø Bundandolayı,overrideedilmeyenmetotları“final”olarak
işaretleyerekçalışmazamanıperformansınıarttıranaraçlar
vardır.
www.javaturk.org
39
ca
de
m
y
BindingTest.java
so
f
t.a
Ø KullandığınızIDE’nin yardımıyla,BindingTest.java’nın main
metodundayapılan“e.work()”ve“boss.youWorkToo()“
metodlarının “implementation”larını bulun.
Ø Eclipse’te fareilemetodunüstünegelipCTRL(Win)yada
CMD(Mac)tuşlarınabasıp“OpenImplementation”u seçin.
Ø Hangimetodunstatik– dinamikbağlandığınıbelirleyin.
w
.s
el
public class BindingTest {
public static void main(String[] args) {
HR hr = new HR();
Employee e = hr.getAnEmployee();
e.work();
w
w
Boss boss = new Boss();
boss.youWorkToo();
}
}
www.javaturk.org
40
ca
de
m
y
Java’daMetotlarıStatikBağlama- III
Ø Java’dastatic olanmetotlarstatikolarakbağlanırlar.
w
w
w
.s
el
so
f
t.a
Ø Eğer,ebeveyndeolanstatikbirmetodualtsınıftatekrar
tanımlarsanızbuoverriding olmaz.
Ø Bunagölgeleme (shadowing)denir.
Ø Yani,altsınıftakimetot,ebeveyndendevralınanmetodu
gölgeler.
www.javaturk.org
41
y
ca
de
m
DeğişkenBağlama
Ø Java’danesnevesınıfdeğişkenleridenesnelerestatik
olarakbağlanırlar.
so
f
t.a
Ø Overriding,sadecenesnemetotlarıiçingeçerlidir,
değişkenleriçinsözkonusudeğildir.
w
w
w
.s
el
Ø Eğer,ebeveyndeolanbirdeğişkeni(nesneyadastatik
olsun)altsınıftatekrartanımlarsanızbuoverriding olmaz,
gölgeleme (shadowing)olur.
www.javaturk.org
42
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Sonuçlar
www.javaturk.org
43
y
ca
de
m
NedenPolymorphism?
so
f
t.a
Ø Polymorphism,programlarınparçalarıarasındaki
bağımlılıklarıarayüzseviyesineçekerekdahakolay
değiştirebilmeimkanısağlar.
Ø Polymorphismsayesindearayüzilegerçekleştirmeyi
ayırabiliriz.
el
Programto aninterfacenotanimplementation.
w
w
.s
Ø Varolanhiyerarşiyeyapılacakdeğişiklikler,ohiyerarşiyien
tepedekisınıf(yaniarayüz)düzeyindebilenistemcisınıfları
etkilemez.
w
Ø Bupolymorphismin entemelartısıdır.
www.javaturk.org
44
ca
de
m
y
Polymorphismin BirSonucu- I
t.a
Ø Polymorphismin negatiftarafıise,bahsedilenentemel
artısınınbirsonucudur.
Ø Polymorphismde altsınıflarınkendilerinehasözelliklerini
kullanamayız.
w
.s
el
so
f
Ø Çünküpolymorphism,birhiyerarşidekinesneleri,
hiyerarşininentepesindekinesnecinsindenifade
ettiğinden,altsınıflarınnesneleridetepesınıfınnesnesi
olarakgörülür.
w
w
Ø Bukalıtımınsağladığıgenelleştirme- özelleştirmeilişkisi
üzerinebinaedilenpolymorphicdavranışınbirsonucudur.
www.javaturk.org
45
ca
de
m
y
Polymorphismin BirSonucu- II
so
f
t.a
Ø Birmetodunarayüzü,ometodunkendisiüzerindeçağrıldığı
referansıntipitarafındanbelirlenir.
Ø BundandolayıEmployee tipindekireferansınüzerindesadece
Employee’nin arayüzündeki metotlarçağrılabilir.
Ø Ometodunhangigerçekleştirmesininalınacağıise
referansıngösterdiğinesnetarafındanbelirlenir.
w
w
w
.s
el
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.javaturk.org
46
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Downcasting (Alçaltma)
www.javaturk.org
47
y
ca
de
m
el
so
f
t.a
Ø Birreferansıyadanesneyialıponu
üsttipindenbirreferansaatamaya
upcasting (yükseltme)denir.
Ø Upcasting,yerinegeçebilme
özelliğindendolayıherzaman
güvenlidir.
Ø Dolayısıylacastoperatörü“()”
kullanmayagerekyoktur.
w
w
w
.s
Manager m = new Manager();
Employee e = m;
ya da doğrudan
Employee e = new Manager();
Manager m = new Director();
Emlpoyee e = new Director();
Referans
Upcasting
Upcasting (Tekrar)
www.javaturk.org
Nesne/Referans
48
ca
de
m
y
Downcasting - I
t.a
Ø Peki,üstbirtiptenolanbirreferansıyadanesneyi,alt
tiplerindenolanbirreferansaatayabilirmiyiz?
Ø Vebuneişeyarar?
w
w
w
.s
el
so
f
Ø Üsttiptenolanbirreferansıyadanesneyialıponualt
tipindenbirreferansaatamayadowncasting (alçaltma)
denir.
www.javaturk.org
49
ca
de
m
y
Downcasting - II
w
.s
el
so
f
t.a
Ø Java,üsttiptenolanbirreferansıya
danesneyialıponualttipindenbir
referansaatamayaizinvermez,
derlemehatasıverir.
Ø Butürdenatamayayanidowncastinge
ancakcast operatörü “()”ileizinverir.
Ø Castoperatörüiçindehedeftip
bulunur.
Downcasting
Nesne ya da
Referans
w
w
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.javaturk.org
Referans
50
y
ca
de
m
Downcasting - III
el
so
f
t.a
Ø Castoperatörükullanarakçevrimezorlamak,derleyici
hatasınıgideriramaçalışmazamanındahalagerçek
nesneninçevrilentipeuygunolmamamariskivardır.
Ø Eğercastedilennesneyadareferansıngösterdiğinesne,
hedeftiptenyadaonunalttipindendeğilse,budurumda
çalışmazamanındajava.lang.ClassCastException sıradışı
durumuoluşur.
w
.s
Employee e = new Manager();
Manager m = (Manager) e;
// Gerçek tipe geri dönüş
w
w
Employee e = new Employee();
Manager m = (Manager) e;
// ClassCastException!
Director d = (Director) new Manager(); // ClassCastException!
Director d = (Director) new Employee();// ClassCastException!
www.javaturk.org
51
y
w
w
w
.s
el
so
f
t.a
ca
de
m
DowncastingExample.java
www.javaturk.org
52
y
ca
de
m
Downcasting - IV
el
so
f
t.a
Ø Downcast işlemineçoğunlukla,üsttiptenbirreferans
döndürenmetotçağrılarındansonraihtiyaçduyulur.
Ø Castoperatörükullanarakçevrimyaparken,çevriminuygun
birtipeyapılmamasıihtimalindendolayıClassCastException
sıradışıdurumufırlatılabilir.
w
.s
HR hr = new HR();
Employee e = hr.getAnEmployee();
// Exact type of the returned object is not known!
w
w
Director d = (Director) e; // Risk of ClassCastException!
d.makeAStrategicPlan();
www.javaturk.org
53
y
ca
de
m
ClassCastException
w
w
w
.s
el
so
f
t.a
Ø ClassCastException,java.lang paketindekisıradışıdurum
sınıflarındanbirisidir.
Ø Birnesne,nesnesiolmadığı,kenditipininalttiplerinden
birineçevrilmeyeçalışıldığındafırlatılır.
www.javaturk.org
54
y
ca
de
m
instanceof Operatörü
el
so
f
t.a
Ø Castoperatörükullanarakçevrimyaparken,çevriminuygun
birtipeyapılmamasındandoğacakClassCastException sıra
dışıdurumunuönlemeninyöntemi,instanceof
operatörüdür.
Ø instanceof operatörüsağavesolabirertaneolmaküzereiki
taneoperand alırveboolean döndürür:
Ø Soldakitestedilecekreferans,sağdakiisehedeftiptir.
w
w
w
.s
Employee e = new Employee();
if(e instanceof Manager){
Manager m = (Manager) e;
}
Director d = (Director)new Manager();
Director d = (Director)new Employee();
www.javaturk.org
55
y
w
w
w
.s
el
so
f
t.a
ca
de
m
InstanceofExample.java
www.javaturk.org
56
ca
de
m
y
Upcasting vs.Downcasting - I
Ø Upcasting,tümnesneleri,ebeveynleritipindengörmemizi
veonlarasankiebeveynmişgibidavranmamızısağlar.
so
f
t.a
Ø Upcastingin negatiftarafıise,üsttiplerdenreferanslarla
gösterilennesnelerin,ebeveynlerindeolmayan,kendilerine
hasolanözelliklerinikaybetmeleridir.
w
w
w
.s
el
Ø Çünkübirnesneninüzerindeerişilebilecekolanözellikleri,o
nesneninreferansınıntipibelirler.
Ø Referansüsttiptenolduğuiçinreferansınarayüzü,gerçek
nesneninarayüzünden dahadardır(extends anahtar
kelimesi!)
www.javaturk.org
57
ca
de
m
y
Upcasting vs.Downcasting - II
w
w
w
.s
el
so
f
t.a
Ø Dolayısıylaupcasting,nesneleritektipleştirir,farklılıklarını
ortadankaldırır.
Ø Farklıözellikleresahipolannesneler,aynıreferansa
atandığında,arayüzleriaynileşir vereferansınarayüzüne iner.
Ø Downcasting isebuşekildekendinehasolanözelliklerini,
üsttiptenreferansaatanmasındandolayıkaybetmişolan
nesnelere,varolanözelliklerinigerikazandırır.
Ø Upcasting iletektipleşmişolannesneler,downcasting ile
tabiricaizsekendilerinegelirler,tümözelliklerini
gösterebilirler.
www.javaturk.org
58
y
ca
de
m
TestPayrollOffice.java
w
w
w
.s
el
so
f
t.a
Ø TestPayrollOffice.java’yı çalıştırmadanönce
PayrollOfice.java’daki paySalary(Employee e)metodunu
değiştirin.
www.javaturk.org
59
ca
de
m
y
Özet
t.a
Ø Bubölümde,çokşekillilik (polymorphism)elealındır.
Ø Referanslarvemetotlarınpolymorphic davranışlarıincelendi.
so
f
Ø Tiplerarasındakiupcasting vedowncasting çevrimleri
(conversion)elealındı.
w
w
w
.s
el
Ø instanceof operatörüileRunTime Type Identification (RTTI)
işlendi.
www.selsoft.academy
60
y
ca
de
m
t.a
w
w
w
.s
el
so
f
Ödevler
www.selsoft.academy
61
ca
de
m
y
Ödevler I
Ø DahaönceoluşturduğunuzShape hiyerarşisinielealın.
w
w
w
.s
el
so
f
t.a
Ø Canvas sınıfınınüzerindevarolandrawShape() veeraseShape()
metotlarındaçizilenyadasilinennesneningerçektipinegöre
yarıçapını,kenarlarınıveyüksekliğinikonsolayazın.
www.javaturk.org
62
ca
de
m
y
Ödevler II
w
w
w
.s
el
so
f
Ø Upcasting ve
downcasting ile
instanceof kullanacak
şekilde
RegistrationOffice
metotlarınıkurgulayın.
t.a
Ø Yandakiyapıyıoluşturun.
www.javaturk.org
63

Benzer belgeler

buradan

buradan JVM,  üzerinde  onlarca  farklı  amaçlarla  geliştirilmiş  dilin  çalışmasına   izin  veren  sanal  bir  ortamdır   Groovy:  Dinamik  tipli  bir  dil  

Detaylı