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
kullanabilirsiniz
ve
isteyenleri
hIp://www.javaturk.org
adresine
yönlendirip,
bu
malzemelerin
en
güncel
hallerini
almalarını
sağlayabilirsiniz.
Ø Yukarıda...
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...
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...