9. Bölüm Tekrar Kullanım ve Kalıtım

Transkript

9. Bölüm Tekrar Kullanım ve Kalıtım
rg
rk
.o
Java ile Nesne Merkezli Programlamaya Giriş w
.ja
va
tu
9. Bölüm
Tekrar Kullanım ve Kalıtım
w
w
Akın Kaldıroğlu www.javaturk.org Mayıs 2015 rg
Küçük Ama Önemli Bir Konu rk
.o
Ø  Bu dosya ve beraberindeki tüm, dosya, kod, vb. eğiAm malzemelerinin tüm w
w
w
.ja
va
tu
hakları Akın Kaldıroğlu’na aiEr. Ø  Bu eğiAm malzemelerini kişisel bilgilenme ve gelişiminiz amacıyla kullanabilirsiniz ve isteyenleri hIp://www.javaturk.org adresine yönlendirip, bu malzemelerin en güncel hallerini almalarını sağlayabilirsiniz. Ø  Yukarıda bahsedilen amaç dışında, bu eğiAm malzemelerinin, Acari olsun/
olmasın herhangi bir şekilde, toplu bir eğiAm faaliyeAnde kullanılması, bu amaca yönelik olsun/olmasın basılması, dağıRlması, gerçek ya da sanal/
Internet ortamlarında yayınlanması yasakRr. Böyle bir ihAyaç halinde lüTen benimle, [email protected] adresinden ileAşime geçin. Ø  Bu ve benzeri eğiAm malzemelerine katkıda bulunmak ya da düzeltme ve eleşArilerinizi bana iletmek isterseniz çok sevinirim. Ø  Bol Java’lı günler dilerim. www.javaturk.org
2
rg
Gündem rk
.o
Ø Bu bölümde, nesne-­‐merkezli programlamada tekrar tu
kullanım (reusability) ele alınacakRr. Ø Tekrar kullanımın en temel iki hali olan bileşim (composiAon) ve va
kalıRm ya da miras (inheritance) işlenecekAr. w
.ja
Ø Overriding mekanizması işlenecekAr. w
w
Ø Object sını] ve metotları ele alınacakRr. www.javaturk.org
3
rg
rk
.o
tu
va
Tekrar Kullanım (Reusability) w
w
w
.ja
www.javaturk.org
4
rg
Tekrar Kullanım (Reusability) rk
.o
Ø Tekrar kullanım (reusability), var olan yazılım yapılarından yararlanarak, lego bloklarını kullanır gibi, yeni yazılım sistemleri gelişArmekAr. va
tu
Ø Tekrar kullanım, Yazılım Mühendisliği’nin nirvanasıdır. Ø Ama yazılımların, soyut, aşırı karmaşık ve değişime zorunlu w
w
.ja
doğası, bir yazılım yapısının, kendisi için gelişArildiği sistemden başka bir yerde kullanılabilmesini son derece zorlaşRrmaktadır. Ø Yine de nesne merkezli diller, en temel seviyede tekrar w
kullanımı amaçlayan mekanizmalara sahipArler. www.javaturk.org
5
rg
Farklı Seviyelerde Tekrar Kullanım va
tu
rk
.o
Ø Yazılımda, çok farklı şeyler tekrar kullanıma konu olabilir: Ø Metotlar, tekrar kullanımın en basit ve sık uygulandığı yapılardır. Ø Sınıfların tekrar kullanımı daha geniş olmakla birlikte daha zordur. Ø Daha karmaşık olan bileşenler (components) ve çerçeveler w
w
.ja
(frameworks) ile tekrar kullanım çok daha yüksek seviyede elde edilir ama başarılması bir o kadar da zordur. Ø Ayrıca iş süreçleri analizi, mimari yaklaşımlar, tasarım, test yapıları vs. hep tekrar kullanıma konudurlar. w
Ø Tasarım kalıpları, çok Apik tasarım tekrar kullanımına örnekAr. www.javaturk.org
6
rg
Yeni Bir Sınıf w
.ja
va
tu
rk
.o
Ø Yeni bir sınıfa ihAyaç duyulduğunda alternaAfler şunlardır: Ø Pazardan bir tane saRn almak, Ø Sı]rdan yazmak, Ø Var olan sınıflardan yararlanarak bileşik (composite) bir sınıf oluşturmak, Ø Var olan bir sınıean devralarak bir alt sınıf (sub-­‐class) oluşturmak. Ø İdeal ve aynı zamanda en az muhtemel olan ilk seçenekAr. Ø İlk başta kolay gözüküp de uzun vadede en sıkınRlı olan w
ikinci seçenekAr. Ø 3. ve 4. seçenekler ise sırasıyla tekrar kullanımın, bileşik w
nesne oluşturma (composiAon) ve kalıRm (inheritance) şekilleridir. www.javaturk.org
7
rg
rk
.o
tu
va
Bileşim (Composition) w
w
w
.ja
www.javaturk.org
8
rg
Bileşik Nesneler rk
.o
Ø Nesne birleş3rme (object composi3on), birden fazla nesneyi bir araya geArilerek daha karmaşık nesneler oluşturmakRr. tu
Ø Bileşik nesneler (composite object) genel olarak, başka va
sınıfların nesnelerini, nesne değişkeni olarak kendinde barındıran yapılardır. w
.ja
Ø Bu ilişki sahip olma (has-­‐a) ilişkisi olarak ifade edilir. Ø Unutulmamalıdır ki sahip olma, referanslar üzerinden gerçekleşmektedir. Ø Nesne birleşArme ile nesneler arasında bir ilişki w
w
(associa3on) ve aynı zamanda bir bağımlılık (coupling) oluşturulur. Ø Bu durum, nesneler arasındaki en yaygın ilişki kalıbıdır. www.javaturk.org
9
w
w
w
.ja
va
tu
rk
.o
rg
Car as A Composite Object www.javaturk.org
10
public class Car {
private String make;
private String model;
private String year;
private int distance;
private int speed;
public Engine engine;
private Transmission tx;
private Door[] doors;
private Wheel[] wheels;
rk
.o
rg
public class Engine{
private String make;
private int cc;
private int horsePower;
private int rpm;
...
}
tu
w
.ja
va
public Car(..., int doorCount,...){
engine = new Engine(...);
tx = new Transmission(...);
doors = new Door[doorCount];
wheels = new Wheel[4];
...
}
public void start(){
engine.start();
}
...
public class Door {
private boolean closed;
...
}
w
public class Transmission {
private boolean manual;
...
}
w
}
public class Wheel{
private int size;
...
}
www.javaturk.org
11
w
w
w
.ja
va
tu
rk
.o
rg
CarTest.java www.javaturk.org
12
rg
Bileşik Nesne ve Bileşenler va
tu
rk
.o
Ø Bileşik nesneler, bileşenlerinden hizmet alırlar: Ø Bileşik nesne, kendisinden isteneni, bileşenlerinden hizmet alarak yerine geArir. Ø Buna, yönlendirme (delega3on) denir. .ja
w
w
w
Ø Bileşik nesnelerin arayüzleri, bileşenlerinden bağımsızdır. Ø Bileşik nesne, bileşenlerinin arayüzlerini toplayıp, farklı bir arayüzle kulanıma açar. www.javaturk.org
13
rg
Bileşenlerin YaraRlması rk
.o
Ø Bileşik nesnelerde, bileşenlerin ne zaman oluşturulacağı karar verilmesi gereken bir konudur: tu
Ø TanıRldığı yerde ya da kurucularda oluşturulabilir. va
Ø Bir başka yerde oluşturulup bileşik nesneye geçilebilir. .ja
Ø İlk durum genel olarak daha sıkı (composiAon), ikinci durum w
w
w
ise daha gevşek bir ilişkiyi (aggregaAon) ifade edebilir. www.javaturk.org
14
rg
Uygulama rk
.o
Ø Selesi, ön ve arka tekerleği ile pedal takımı olan bir bisiklet sını] oluşturun. Ø Bisiklet sını], belirAlen sınıflardan nesne değişkenlerine sahip va
tu
olmalı ve kendisinden istenen hizmetlere, nesne değişkenleri yardımıyla cevap vermelidir. w
w
w
.ja
www.javaturk.org
15
rg
rk
.o
tu
va
Miras -­‐ Kalıtım (Inheritance) w
w
w
.ja
www.javaturk.org
16
rg
Miras I rk
.o
Ø Miras ya da kalı@m (inheritance), aralarında yapısal w
w
w
.ja
va
tu
benzerlik bulunan nesneleri ifade etmekte kullanılan, en yaygın ikinci tekrar kullanım kalıbıdır. Ø Miras, is-­‐a (olma) ya da is-­‐like-­‐a (gibi olma) ilişkisidir. Ø Kendisinden miras alınan sınıfa ebeveyn (parent/base), miras alan sınıfa ise çocuk (child/sub-­‐class) sınıf denir. Ø TüreAlen ya da çocuk sınıf, ebeveyninden, miras olarak alınabilecek üye değişkenler ile üye metotları devralır. Ø Dolayısıyla, çocuk sınıflar, ebeveynlerine, durum ve davranış açısından benzerler. www.javaturk.org
17
rg
Miras II rk
.o
Ø Miras yapısını kurmak için Java’da extends anahtar kelimesi tu
kullanılır: Employee{
int no;
String name;
int year;
String department;
w
w
w
.ja
va
public class
protected
protected
protected
protected
...
}
public class Manager extends Employee{
protected String departmentManaged;
...
}
www.javaturk.org
18
rg
Miras İlişkisi -­‐ I va
tu
rk
.o
Ø Bu ilişki aşağıdaki okuma şekillerine imkan verir: Ø Her Manager/Bütün Managerlar aynı zamanda bir Employee’dir. Ø Her Manager/Bütün Managerlar bir Employee gibidirler. .ja
Ø Çocuk sınıf, ebeveyninde private olan yapıları devralamaz, w
w
w
ancak protected , public ya da aynı pakeIe ise varsayılan olanları devralır. Ø protected olan üye değişkenler halen dış dünyaya kapalıdırlar ama genelde public olan metotlar her halükarda devralınırlar. www.javaturk.org
19
rg
Miras İlişkisi -­‐ II rk
.o
Ø Miras ilişkisi ile tüm devralınabilecek olan ebeveyn üyeleri, çocuk sınıflar tara]ndan devralınır: tu
Ø Nesne değişkenleri ve metotları va
Ø Sınıf değişkenleri ve metotları w
w
w
.ja
Ø Ebeveynin kurucuları ise çocuklar tara]ndan devralınmaz. www.javaturk.org
20
rg
Üye Erişim Niteleyicileri I (Tekrar) w
.ja
va
tu
rk
.o
Ø Üyelere erişim için 4 seviye vardır: Ø public olan üyelere her yerden erişilir ve devralınır. Ø private olan üyelere sadece içinde bulunduğu sınıean erişilir, dışarıdan erişime tamamen kapalıdır ve devralınamaz. Ø Varsayılan (default) olan üyelere erişim sadece paket içindeki sınıflara açıkRr ve sadece aynı pakeIeki çocuk sınıflar devralabilir. Ø protected, hem aynı pakeIeki sınıflara açıkRr ve hem de herhangi bir pakeIeki alt sınıflarca devralınır. w
w
Mirası düşünerek, üyelerin private yerine protected yapılması genel bir uygulamadır. Ø  Devir/miras amacıyla protected olan üyeler de API’ye dahildirler. Ø 
www.javaturk.org
21
public Herkes (Farklı Pakette) + + + -­‐ + + -­‐ -­‐ + -­‐ -­‐ -­‐ w
w
w
-­‐ (varsayılan) private Çocukları (Farklı Pakette) .ja
protected + + + + Paketi tu
Kendisi va
Niteleyici rk
.o
rg
Üye Erişim Niteleyicileri II (Tekrar) www.javaturk.org
22
rg
InheritanceExample.java rk
.o
Ø Önce, aynı pakeIeki ParentClass1 sını]ndan devralmayı w
w
w
.ja
va
tu
sonra da otherPakage pakeAndeki ParentClass2 sını]ndan devralmayı deneyin, protected olan üyelerin davranışını gözlemleyin. www.javaturk.org
23
rg
rk
.o
tu
va
Kurucular (Constructors) w
w
w
.ja
www.javaturk.org
24
rg
Kurucular (Constructors) rk
.o
Ø Miras söz konusu olduğunda kurucularla ilgili iki önemli tu
nokta söz konusudur: Ø Kurucular devralınmazlar. va
Dolayısıyla her türeAlen sınıf kendi kurucusunu tanımlamak zorundadır. .ja
Ø 
Ø Hiyerarşide alIa bulunan her sınıf, ebeveynindeki bir w
Bu da “her çocuk sını]n nesnesinin içinde, gizli de olsa bir ebeveyn nesnesi var” anlamına gelmektedir. w
Ø 
w
kurucuyu çağırmak zorundadır. www.javaturk.org
25
rg
super() Çağrısı -­‐ I rk
.o
Ø Bir sını]n, ebeveynindeki bir kurucuyu çağırması super() ile .ja
va
tu
olur. Ø super() çağrısı parametre geçmezse, ebeveyndeki argümansız kurucu çağrılmış olur. Ø super() çağrısı tabi olarak parametre geçebilir, bu durumda ebeveyndeki bir akıllı kurucu çağrılmış olur. Ø Tipik olarak, ebeveynin tanımladığı durum bilgisi çocuk nesne w
w
w
oluşturulurken kurucusuna geçilir ve bu kurucu da bu durum bilgisini super() ile ebeveynindeki akıllı bir kurucuya geçer ki atamalar ebeveynin kurucusunda yapılsın. Ø Çocuk nesnenin kurucusuna geçilen ve ona has olan durum bilgisi ise ebeveyne geçilmez. www.javaturk.org
26
rg
super() Çağrısı -­‐ II olmalıdır. rk
.o
Ø super() çağrısı içinde bulunduğu kurucuda ilk çalışan kod Ø Dolayısıyla, çocuk nesne oluşmadan önce, içindeki gizli olan w
w
w
.ja
va
tu
ebeveyn nesne oluşmalıdır. www.javaturk.org
27
rk
.o
Ø Employee, Manager ve Director rg
Employee, Manager ve Director.java w
w
w
.ja
va
tu
sınıflarının kurucularına dikkat edin. Ø org.javaturk.oop.ch09.factories
.factory1.Test www.javaturk.org
28
rg
rk
.o
tu
va
Başlatma (Initialization) w
w
w
.ja
www.javaturk.org
29
rg
Mirasta Başlatma rk
.o
Ø Hiyerarşide alIa bulunan her sınıf, ebeveynindeki bir kurucuyu çağırmak zorundadır. Ø Bu da “her çocuk sını]n nesnesinin içinde, gizli de olsa bir tu
ebeveyn nesnesi var” anlamına gelmektedir. va
Ø Bir sını]n, ebeveynindeki bir kurucuyu çağırması super() ile w
w
w
.ja
olur. Ø super() yoluyla yapılan kurucu çağrıları hiyerarşinin en tepesindeki sınıfa kadar devam eder. Ø Dolayısıyla en önce hiyerarşinin en tepesindeki sını]n kurucusu çağrılır ve nesnesi oluşur. Ø Bunun dışında başlama sırasında değişen bir şey yoktur. www.javaturk.org
30
rg
Başlama Sırası rk
.o
Ø Dolayısıyla başlama sırası, sınıf hiyerarşisindeki en tu
yukarıdaki sınıean aşağıya doğru olur. Her sınıeaki başlama sırası ise Ø Sınıf değişkenleri (staAk başlatma blokları dahil) w
şeklindedir. .ja
va
Ø Nesne oluşturuluyorsa Ø  Nesne değişkenleri (nesne başlatma blokları dahil) Ø  Kurucu çağrısı Ø Birden fazla sınıf ve nesne değişkeni olduğu durumda w
w
başlatma sırası, fiziksel sırayla belirlenir, önce gelen önce başlaRlır. www.javaturk.org
31
rg
w
w
w
.ja
va
tu
rk
.o
IniAalizaAonOrder.java www.javaturk.org
32
rg
rk
.o
tu
va
Genişletme ve Yerine Geçebilme w
w
w
.ja
www.javaturk.org
33
rg
Genişletme yapılara ekleme yapabilirler: rk
.o
Ø Çocuk sınıflar, ebeveynlerinden miras olarak devraldıkları Ø Çocuk sınıflar, genel olarak, ebeveynlerinde olmayan, yeni .ja
va
tu
üye değişkenlere ve yeni metotlara sahip olurlar. Ø extends anahtar kelimesi zaten bu genişletmeyi ifade etmektedir. w
Ø Bu durumda türeAlen çocuk sınıf, yeni üye değişkenlerle w
w
daha zengin bir yapıya, yeni metotlarla da daha geniş bir arayüze sahip olur. www.javaturk.org
34
rg
Yerine Geçebilme I rk
.o
Ø Miras ilişkisinde çocuk sını]n arayüzü, en azından ebeveyninin ara yüzüdür. Ø  Çocuk sınıflar, ebeveynlerinden devraldıkları arayüze eklemeler .ja
va
tu
yaparak daha geniş bir ara yüze sahip olup, daha çok iş yapar hale gelseler bile, ebeveynlerinin arayüzünü desteklemeye devam ederler. Ø  Bu durum, üye değişkenler için de böyledir, yani ebeveynde erişilen her değişkene, çocuklarda da erişilir. Ø  Ama prensip olarak değişkenlerin protected olduğunu ve dışarıdan w
w
ulaşılamadığını varsayıyoruz. Ø Dolayısıyla, çocuk sınıflar, ebeveynlerinin sağladığı her w
özelliği, değişken ya da arayüz, sağlamak zorundadırlar. www.javaturk.org
35
rg
Yerine Geçebilme II rk
.o
Ø Bu durum, yerine geçebilme (subs3tutability) olarak ifade edilir ve hiyerarşide aşağıdan yukarıya doğru çalışır. Ø Yani, ebeveynin olduğu her yerde, ebeveynin çocuklarından tu
birisi olabilir. Her Manager aynı zamanda bir Employee’dir. Ø  Yani, patron, “bana bir çalışan çağırın” dediğinde, ona bir Manager gelirse, patronun isteği yerine gelmiş olur. Ø  Ya da patron, tüm çalışanlar toplansın dediğinde, Manager “beni çağırmıyor” diyemez. w
w
w
.ja
va
Ø 
www.javaturk.org
36
rk
.o
Ø Miras ilişkisi, bir genelleş3rme-­‐
rg
GenelleşArme-­‐ÖzelleşArme w
w
.ja
va
tu
özelleş3rme (generaliza3on-­‐
specializa3on) ya da genel-­‐özel (generic-­‐specific) ilişkisidir. Ø Yani hiyerarşide yukarı çıkıldıkça daha genel nesneler, aşağı inildikçe, o nesnelerin daha özel halleri bulunur. Ø Ama yerine geçebilme özelliği her zaman geçerlidir: w
Ø Her Director aynı zamanda hem bir Manager hem de bir Employee’dir. www.javaturk.org
37
rg
Employee, Manager ve Director.java w
w
w
.ja
va
tu
rk
.o
Ø org.javaturk.oop.ch09.factories.factory2.Test www.javaturk.org
38
rg
Uygulama rk
.o
Ø Bir üniversitedeki öğrencileri, aralarındaki miras ilişkisini göz önüne alarak şekildeki gibi modelleyin. tu
Ø Kurucu çağrılarını super() kullanarak kurgulayın. w
w
w
.ja
va
Ø Hangi durumlarda genişletme söz konusudur tarRşın. www.javaturk.org
39
rg
rk
.o
tu
va
.ja
w
w
w
www.javaturk.org
40
rg
rk
.o
tu
va
Overriding (Ezme) w
w
w
.ja
www.javaturk.org
41
rk
.o
Ø Bir hiyerarşide yer alan rg
Davranış Devralma -­‐ I va
tu
nesnelerinden ebeveynde tanımlanan bir metodun, private olmadığı müddetçe, alRndaki nesneler tara]ndan da devralındığını biliyoruz. Ø Hiyerarşideki bütün nesneler, w
.ja
hangi tür olursa olsun, ebeveynindeki sorumluluklara sahipAr. w
Ø Fakat çocukların aynı sorumluluğu w
farklı davranarak yerine geArmeleri mümkün müdür? www.javaturk.org
42
rg
Davranış Devralma -­‐ II rk
.o
Ø Hiyerarşinin alRndaki nesneler tabi olarak kendileri için tu
gerekli yeni metotlar tanımlayabilirler. Ø Fakat istenen şey, aynı metodun tüm hiyerarşi için geçerli .ja
va
olurken hiyerarşide alIa bulunan çocukların metodun davranışını değişArebilmeleridir. w
Ø Bu ise metodun arayüzünün aynen bırakılıp, w
w
gerçekleşArmesinin yani kodunun değişArilmesiyle söz konusu olur. www.javaturk.org
43
rg
Overriding – Ezme -­‐ I rk
.o
Ø Nesneler, ebeveynlerinden devraldıkları metotların .ja
va
tu
arayüzlerini değişArmeden, kodunu değişArebilirler. Ø Buna overriding ya da ezme denir. Ø Yani çocuk nesneler, ebeveynlerindeki sorumluluğu, farklı bir şekilde yerine geArmeyi tercih edebilirler. Ø Overriding ile aynı sorumluluk farklı şekillerde yerine geArilir: w
Ø Sorumluluk aynıdır, çünkü arayüz (interface) aynıdır, ama w
sorumluluğu yerine geArme şekli (implementaAon) farklıdır. w
Ø Bu şekilde override edilen metotlara polymorphic (çok şekilli) metotlar denir. www.javaturk.org
44
rg
Overriding – Ezme -­‐ II rk
.o
Ø Bu şekilde override edilen metotlara polymorphic (çok tu
şekilli) metotlar denir. Ø Çünkü sorumluluk bir tanedir çünkü arayüz bir tanedir ve .ja
va
ebeveynde tanımlanır. w
fazladır. w
Ø Ama sorumluluğu yerine geArme yani metot birden w
Ø Bu yüzden override edilebilen metotlara polymorphic denir. www.javaturk.org
45
rk
.o
w
w
w
.ja
va
tu
Employee üzerinde tanımlanan printInfo() ve calculateSalary() metotlarının Manager ve Director için override edildiğini gözlemleyin. rg
Employee, Manager ve Director.java www.javaturk.org
46
rg
Overriding – Ezme -­‐ III rk
.o
Ø Override, sadece nesne metotları için geçerlidir. Ø Nesne metotlarını aynı arayüzle alt sınıflarda tekrar Ø 
va
tu
tanımlarsanız, onları override etmiş (ezmiş) olursunuz. Ø Üye değişkenleri aynı isimle alt sınıflarda tekrar tanımlarsanız, ebeveyndekileri devralmamış, sadece saklamış olursunuz. Çünkü overriding değişkenler için tanımlı değildir. .ja
Ø StaAk metotlar da override edilemezler. w
Ø Polymorphic davranış sadece nesne metotları için w
w
geçerlidir, üye değişkenler ve staAk metotlar polymorphic değildirler. Ø Polymorphismi ileride ele alacağız. www.javaturk.org
47
w
w
w
.ja
va
tu
rk
.o
rg
ShadowingExample.java www.javaturk.org
48
w
w
w
.ja
va
tu
rk
.o
rg
StaAcOverridingExample.java www.javaturk.org
49
rk
.o
rg
Bir Nokta! va
tu
public class SubClass extends ParentClass{
private int i;
void f(){}
}
w
.ja
class ParentClass{
public int i;
public void f(){}
}
w
Ø Yukarıdaki kod derleme hatası verecekAr? w
Ø Neden? www.javaturk.org
50
rg
Daha Kısıtlayıcı Olarak Override rk
.o
Ø Override ederken, devralınan metodu daha kısıtlayıcı bir tu
erişim belirteciyle tanımlayamazsınız. Ø Aksi takArde, ebeveyn üzerinden ulaşılan bir metodun, w
w
w
.ja
va
çocuk nesneler üzerinden ulaşılamaması söz konusu olurdu! www.javaturk.org
51
rg
Override Ederken Alt Tip Return -­‐ I rk
.o
Ø Java SE’nin 1.5 sürümünden iAbaren, override ederken, tu
devralınan metodun dönüş Api, alt Apleriyle yer değişArebilir. Ø Buna covariant return type denir. va
Ø Yani alt Apteki bir metot, ebeveynindeki metodun w
w
.ja
döndürdüğü Apin daha özel Apini döndürebilir, yerine geçebilme özelliği hala korunur. Ø Çünkü daha geniş bir Ap bekleyen istemci sınıfa daha özel bir Ap döndürmek problemli değildir. w
Ø Yerine geçebilme özelliği! www.javaturk.org
52
w
w
w
.ja
va
tu
rk
.o
rg
Override Ederken Alt Tip Return -­‐ II www.javaturk.org
53
tu
rk
.o
Ø Aşağıdaki kod ile ilgili problem nedir? rg
Bir Soru? // Error!
.ja
va
HR hr1 = new HRForManagers();
Manager m1 = hr1.getAnEmployee();
System.out.println(m1);
w
w
w
Ø Unutmayın: Ø Referansın Api, üzerinde çağrılabilecek metotları ve arayüzlerini, referansın gösterdiği nesnenin Api ise gerçekte çağrılan metodu belirler. www.javaturk.org
54
rg
Bir Nokta: Overloading rk
.o
Ø Ebeveyn sınıea tanımlanan bir metodu, farklı arayüz ama w
w
w
.ja
va
tu
aynı isimle bir alt sınıea tekrar tanımlarsak, tabi olarak bu overloading olur. www.javaturk.org
55
rg
@Overriding Notu rk
.o
Ø Override edilen metotlar “@Overriding” ile notlandırabilir w
w
.ja
va
tu
(annotaAng). Ø Java’da “@” ile başlayan ve Ap, metot, değişken, parametre vb. yapıları niteleyen öğelere not (annota3on) denir. Ø Notların kullanımı bazen isteğe bağlıdır “@Override”da olduğu gibi, bazen daha fonksiyonel amaçlar için kullanılır. Ø Notlar, Java API’sinin bir parçasıdır. Ø “@Override” da java.lang pakeAndeki notlardan birisidir ve nitelediği metodun override edildiğini ifade eder. w
Ø Bu not kullanıldığı halde override yapılmazsa derleyici hata verir! www.javaturk.org
56
rg
Uygulama rk
.o
Ø Modellediğiniz üniversite öğrencilerinde uygun metotları w
w
w
.ja
va
tu
override edin. www.javaturk.org
57
rg
rk
.o
tu
va
super Anahtar Kelimesi w
w
w
.ja
www.javaturk.org
58
rg
super Anahtar Kelimesi rk
.o
Ø Zaman zaman bir hiyerarşide bulunan bir alt sınıean, onun tu
ebeveyn sını]ndaki yapılara ulaşmak isteyebilirsiniz. va
Ø Bu durumda super anahtar kelimesi kullanılır. .ja
Ø super ebeveyn nesnesine bir referansRr ve ebeveyn w
w
nesnesinin özelliklerine ve davranışlarına ulaşmakta kullanılır. w
Ø super sadece bir üsIeki ebeveyne ulaşmak için kullanılır Ø “super.super” gibi bir kullanım söz konusu değildir. www.javaturk.org
59
rg
SuperExample.java rk
.o
Ø Bu örnek dışında factory pakeAndeki Manager ve Director’ w
w
w
.ja
va
tu
sınıflarında da super kullanımı vardır. www.javaturk.org
60
rg
super ve Tekrar Kullanım rk
.o
Ø super, tekrar kullanımı aryrır, kod tekrarını azalRr. tu
Ø Özellikle bir alt Apin davranışının, ebeveyninin davranışını w
w
w
.ja
va
aynen alıp, öncesine ve/veya sonrasına eklemeler yapRğı durumlarda ebeveyndeki davranışı copy-­‐paste ile tekrarlamak yerine super ile tekrar kullanılması çok daha kaliteli bir kod ortaya çıkaracakRr. www.javaturk.org
61
rg
Uygulama rk
.o
Ø Modellediğiniz üniversite öğrencilerinde override eEğiniz w
w
w
.ja
va
tu
metotlarda mümkün olan yerlerde “super” kullanarak kod tekrarından kaçının. www.javaturk.org
62
rg
rk
.o
tu
va
final Sınıflar ve Metotlar w
w
w
.ja
www.javaturk.org
63
rg
Final Sınıflar rk
.o
Ø Eğer bir sınıf final olarak tanımlanırsa mirasa konu olamaz, yani hiç bir sınıf tara]ndan ebeveyn olarak görülemez. tu
Ø Final tanımlanan sınıflar, başka sınıflardan miras devralabilir. Ø Bir sını] final yapmanın en temel sebebi, o sını]n sağladığı .ja
va
davranışların tamamının o haliyle kullanıldığından emin olmakRr. Ø Java API’sinde final olan sınıflar: w
Ø java.lang.String, java.lang.StringBuffer, java.lang.StringBuilder w
Ø java.lang.System w
Ø java.uAl.Objects www.javaturk.org
64
rg
w
w
w
.ja
va
tu
rk
.o
FinalClassExample.java www.javaturk.org
65
rg
Final Metotlar rk
.o
Ø Eğer bir metot final olursa, o metot ezilemez. Ø Bir metodu final yapmanın en temel sebebi, o metodun w
w
w
.ja
va
tu
sağladığı davranışın o haliyle kullanıldığından emin olmakRr. Ø  final olan metot, devralınır ama ezilemediği için, çocuk sını]n nesneleri üzerinden ulaşıldığında, ebeveynde tanımlanan davranışı gösterir. Ø final olan bir sını]n tüm metotları doğrudan final olur. www.javaturk.org
66
w
w
w
.ja
va
tu
rk
.o
rg
FinalMethodExample.java www.javaturk.org
67
rg
private mi final mı? rk
.o
Ø private bir metot devralınmaz, bu yüzden override ezilmesi va
tu
söz konusu değildir. Ø Bu yüzden eğer çocuk sınıf private metodu aynen tekrar tanımlarsa bu ne overriding olur ne de overloading olur! .ja
Ø final bir metot devralınır ama ezilemez. Ø Bu yüzden çocuk sınıf final bir metodu tekrar w
w
w
tanımlayamaz. Ø Bir metodu hem private hem de final yapmak ne anlama gelir? Ø private varken metodu final da yapmak gereksizdir. www.javaturk.org
68
rg
rk
.o
tu
w
w
w
.ja
va
java.lang.Object Sınıfı www.javaturk.org
69
rg
java.lang.Object Sını] -­‐ I rk
.o
Ø java.lang pakeAndeki Object sını], bütün Java sınıflarının w
w
w
.ja
va
tu
doğrudan ve üstü kapalı olarak kendisinden miras devraldıkları sınıeır. Ø Dolayısıyla Object sını], her Java sını]nın ebeveynidir. Ø Java derleyicileri, sını]nızın .class dosyasını üreArken, “extends Object” ifadesini kod eklerler. www.javaturk.org
70
rg
java.lang.Object Sını] -­‐ II rk
.o
Ø Java SE’nin 1.8 sürümü iAbariyle Object sını]nın 11 tane tu
metodu vardır. Ø Bu metotların 6 tanesi finaldır dolayısıyla override .ja
va
edilemez. Ø Geri kalan 5 metot, tüm Java sınıflarında override edilebilir, w
w
haIa edilmelidir. w
Ø Eğer bu metotlar override edilmezlerse Object sını]ndaki varsayılan davranış geçerli olur. www.javaturk.org
71
rg
java.lang.Object Sını] -­‐ III w
w
w
.ja
va
tu
rk
.o
Ø Object sını]ndaki şu metotlar override edilebilir: Ø String toString(): Nesnenin String formunu oluşturur. Ø boolean equals(Object o): Referansı, kendisine geçilen bir başka nesne referansı ile karşılaşRrır. Ø int hashCode(): Nesnenin hash kodunu döndürür. Ø Object clone(): Nesnenin kopyasını oluşturup geri döndürür. Ø void finalize(): Garbage collector tara]ndan toplanmadan önce çağrılır. Temizlik yaparak sistem kaynaklarını bırakmak için kullanılır. www.javaturk.org
72
rg
equals() ve hashCode() Metotları rk
.o
Ø equals() metotları true döndüren nesnelerin hash tu
kodlarının da aynı olması gereklidir. Ø Çünkü hash kodları, hash tablelar tara]ndan kullanılır. Ø Bu şekilde aynı olan nesnelerin hash kodlarının da aynı olması .ja
va
tutarlılık açısından önemlidir. Ø equals() metodunu override ederken, Object geçmek yerine w
w
w
doğrudan aynı Apte nesne geçebilirsiniz. www.javaturk.org
73
rg
equals() ve == rk
.o
Ø “==“ ile eşitlik kontrolü sadece basit Apler üzerinde .ja
va
tu
yapılmalıdır. Ø Nesnelerin eşitliğini anlamak için “==“ kullanılmaz, equals() kullanılır. Ø Eğer karmaşık Apleri kıyaslamakta “==“ kullanılırsa, bu durumda nesneler yerine nesnelerin referansları kıyaslanır. Ø Eğer referanslar aynı nesneyi gösteriyorsa “==“ true w
döndürür, aksi takArde false döndürür. w
Ø Bu yüzden nesnelerin, durumları açısından aynı olup w
olmadıklarını anlamak için equals() metotları daima override edilmelidir. www.javaturk.org
74
rg
Tekli Miras (Single Inheritance) rk
.o
Ø Java’da, bir sını]n diğer bir sınıean devralması anlamında tekli miras vardır. Ø Yani bir sınıf, aynı anda birden fazla sınıean miras tu
devralamaz. va
Ø Ama bir sını]n, hiyerarşinin farklı katmanlarından gelen birden fazla ebeveyni olabilir. .ja
Ø Her Director aynı zamanda hem bir Manager hem de bir w
Employee’dir, yani iki tane ebeveyni vardır. Ø Sınıean devralma anlamında çoklu mirasa izin veren C++’ın w
w
bu özelliğinin geArdiği sıkınRları aşmak üzere Java’da tekli miras vardır. Ø İleride çoklu mirasın Java’da nasıl olabileceğini öğreneceğiz. www.javaturk.org
75
rg
Uygulama rk
.o
Ø Daha önce yapRğınız üniversite örneğindeki sınıflar için w
w
w
.ja
va
tu
equals(), hashCode() ve toString() metotlarını override edin. www.javaturk.org
76
rg
Uygulamalar rk
.o
Ø Daha önce yapRğınız üniversite örneğine benze şekilde bir tu
şekil hiyerarşisi kurun, alt Aplerde metotları override edin ve bu sırada mümkünse “super”i kullanın. w
w
w
.ja
va
Ø equals(), hashCode() ve toString() metotlarını override edin. www.javaturk.org
77
rg
Özet rk
.o
Ø Bu bölümde, nesne merkezli dillerin bir diğer temel özelliği tu
olan miras ay da kalıRm ele alındı. Ø KalıRmın yapısı, bu yolla devralınan özellikler, başlatma .ja
va
sırası, overriding mekanizmaları detaylı olarak işlendi. Ø Bütün Java sınıflarının bir üst sını] olarak java.lang.Object w
w
w
sını] ve metotları işlendi. www.javaturk.org
78

Benzer belgeler

8. Bölüm Java Nesneleri: Organizasyon

8. Bölüm Java Nesneleri: Organizasyon kullanabilirsiniz  ve  isteyenleri  hIp://www.javaturk.org  adresine  yönlendirip,   bu  malzemelerin  en  güncel  hallerini  almalarını  sağlayabilirsiniz.   Ø  Yukarıda...

Detaylı

1. Bölüm Java`ya Giriş

1. Bölüm Java`ya Giriş kullanabilirsiniz  ve  isteyenleri  hIp://www.javaturk.org  adresine  yönlendirip,   bu  malzemelerin  en  güncel  hallerini  almalarını  sağlayabilirsiniz.   Ø  Yukarıda...

Detaylı

Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti

Java Kodunuzun Nesne-Merkezli Olmadığının 10 İşareti Ø Miras,  is-­‐a  (olma)  ya  da  is-­‐like-­‐a  (gibi  olma)  ilişkisidir.   Ø Kendisinden  miras  alınan  sınıfa  ebeveyn  (parent/base),   miras  alan  sınıfa...

Detaylı