Kalıtım
Kalıtım Önceleri programcılar, var olan program kodlarına benzer kodlar yazarlardı. Örneğin: Bir insan kaynakları sistemi değişik çeşitlerde personelin bilgisini tutabilir. Ancak, bu değişik çeşitlerdeki personel aslında ortak birçok özelliğe de sahiptir. Bu, daha önceleri aynı program kodunu değişik yerlere kopyalama, yapıştırma ve üzerinde değişiklik yapma şeklinde yapılıyordu.
Kalıtım Doğal olarak , herhangi birşeyi organize etmede kullanılan hiyerarşi şu şekildedir: süper sınıf (superclass) Eleman Çalışan Gönüllü SaatÜcretli AylıkMaaşlı Danışman Eleman sınıfının alt sınıfı Çalışan sınıfının alt sınıfı SaatÜcretli sınıfının alt sınıfı İlişkileri “olmak” (is a) şeklinde düşünebilirsiniz. Bir çalışan aynı zamanda elemandır. Bir gönüllü de elamandır. Saat ücretli bir kişi aynı zamanda çalışandır. Bir danışman saat ücretli çalışan birisidir.
Sınıflar ve Alt Sınıflar “private” ve “public” konularına daha sonra geleceğiz class Hayvan { public String ad = ""; public String ses = ""; public int numTimesPerformed = 0; // constructors, accessors & modifiers go here public void identifySelf( ) { System.out.println(“Bemim adım “ + ad); } // of identifySelf public void perform( ) { doYourThing( ); numTimesPerformed++; } // of perform public void doYourThing( ) { ; // ‘no-op’ method } // of doYourThing } // of Animal Öyleyse hayvanlar, bir isme, sese sahiplerdir ve kendilerini tanımlayabilirler ve bunun yanında herhangi birşeyi yapabilirler. Hayvan harpo = new Hayvan(); harpo.setName(“Harpo”); harpo.doYourThing(); // hiçbir şey söylemez
Alt Sınıflar Hayvan (Köpek, Hayvandan türer Köpek Kedi İnek Örneğin: “Köpek bir hayvandır” ya da “Bütün köpekler hayvandır”) class Kopek extends Hayvan { public Kopek() { ses = “Hav”; } // yapılandırıcı sonu public void doYourThing ( ) { identifySelf(); System.out.println(“Ben bir köpeğim”); System.out.println(ses); } // of doYourThing } // Kopek sınıfının sonu Hayvan sınıfı hiç bir şey yapmayan doYourThing() metoduna sahiptir. Kopek pickles = new Kopek(); pickles.setName(“Pickles”); pickles.doYourThing(); // çıktı: // “Benim adım Pickles” // “Ben bir köpeğim” // “Hav”
Örneğin: “Kedi bir hayvandır” ya da “Bütün kediler hayvandır”) Köpek Kedi İnek Alt Sınıflar (Kedi, Hayvandan türer. Örneğin: “Kedi bir hayvandır” ya da “Bütün kediler hayvandır”) class Kedi extends Hayvan { public Kedi() { ses = “miyav”; } // yapılandırıcı sonu public void doYourThing ( ) { identifySelf(); System.out.println(“Ben bir kediyim”); System.out.println(ses); } // of doYourThing } // Kedi sınıfının sonu Kedi abby = Kedi Cat(); abby.setName(“Abby”); abby.doYourThing(); // çıktı: // “Benim adım Abby” // “Ben bir kediyim” // “miyav”
Örneğin: “İnek bir hayvandır” ya da “Bütün inekler hayvandır”) Köpek Kedi İnek Alt Sınıflar (İnek, Hayvandan türer. Örneğin: “İnek bir hayvandır” ya da “Bütün inekler hayvandır”) class Inek extends Hayvan { public Inek() { ses = “mö”; } // yapılandırıcı sonu public void doYourThing ( ) { identifySelf(); System.out.println(“Ben bir ineğim”); System.out.println(ses); } // of doYourThing } // Inek sınıfının sonu Inek descartes = new Inek(); descartes.setName(“Sarıkız”); descartes.doYourThing(); // çıktı: // “Benim adım Sarıkız” // “Ben bir ineğim” // “mö”
Sorular?
Kalıtım ve Görünürlük Alanı (scope) Super ve this kullanımı
Kalıtım ve Görünürlük alanı (Scope) Değişkenler (örneğin: ses): Java ilk önce, o anki metodu inceler, yerel değişkenleri ve parametreleri kontrol eder; Java daha sonra, o anki sınıfı inceler (örneğin: Kopek); Java daha sonra, süper sınıfı inceler (örneğin: Hayvan); Java hiyerarşi boyunca ilerleyerek hiç bir süper sınıf kalmayıncaya kadar incelemeye devam eder. Metodlar (örneğin: doYourThing() ya da identifySelf()): Java ilk önce o anki sınıfı inceler; Java daha sonra, süper sınıfı inceler;
Görünürlük alanının belirlenmesi Java size, görünürlük alanıyla ilgili kuralları yeniden belirlemenize izin verir. Hangi değişkene ya da metoda hitap ettiğinizi söyleyebilirsiniz: super deyimi: Süper sınıftan bir metoda ya da değişkene erişirken kullanılır. Örneğin, super.doYourThing( ) this deyimi: O anki aktif nesneye ait bir değişkene ya da metoda ulaşmak için kullanılır. Örneğin, this.doYourThing( )
Super ve this kullanımı Hayvan Köpek Kedi İnek Super ve this kullanımı (ama neden??) Buradaki durumda aşağıdaki ifadeler ile aynı anlamdadır: ses = “hav”; ve this.ses = “hav”; class Kopek extends Hayvan { public Kopek() { super.ses= “hav”; } // yapılandırıcı sonu public void doYourThing ( ) { super.identifySelf(); System.out.println(“Ben bir köpeğim”); System.out.println(ses); } // of doYourThing } // Kopek sınıfının sonu Buradaki durumda aşağıdaki ifadeler ile aynı anlamdadır: identifySelf(); or this.identifySelf();
Super ve this kullanımı class Hayvan { String ad; } class Kopek extends Hayvan { String ad; /* Just so I don't forget! */ void ikiAd() { System.out.println (“Benim köpek adım " + ad); (“Benim hayvan adım " + super.ad); Güzel bir fikir mi?
Super kullanımı Hayvan Köpek Kedi İnek Burada şu anlama geliyor: class Kopek extends Hayvan { // burada yapılandırıcı olduğunu // farzedin public void doYourThing() { identifySelf(); System.out.println(ses); } // of doYourThing public void identifySelf() { super.identifySelf(); System.out.println(“Ben bir köpeğim”); } // of identifySelf } // Kopek sınıfının sonu Burada şu anlama geliyor: this.identifySelf() (aşağıda tanımlanan şekilde) Burada şu anlama geliyor: identifySelf() (Hayvan sınıfında tanımlanan şekilde) Eğer kullanılmasaydı???
Geometri örneği Şekil Daire Dikdörtgen class Sekil { public String ad; public String adAl () { return (this.ad); } // adAl public int alan () { return (0); } // alan } // Sekil Şekil Daire Dikdörtgen Her yeni türeyen sınıf alan() metodunu yeniden tanımlaması gerekir.
Daire sınıfının tanımlanması alıştırma olsun diye size bırakıldı. Yapılandırıcı zinciri class Dikdortgen extends Sekil { private int uzunluk, genislik; Dikdortgen () { this(0, 0); } // yapılandırıcı sonu Dikdortgen (int l, int w) { this( l, w, “dikdörtgen”); } // yapılandrıcı sonu Dikdortgen (int l, int w, String n) { uzunluk = l; genislik = l; ad = n; public int alan () { return (uzunluk * genislik); } // alan public String adAl () { if (uzunluk == genislik) return “kare"; else return super.adAl()); } // adAl public String toString () { String s; s = new String (“Bir " + adAl() + " uzunluğu: " + uzunluk + " ve genişliği " + genislik); return (s); } } // toString } // Dikdortgen sınıfının sonu Daire sınıfının tanımlanması alıştırma olsun diye size bırakıldı.
Yapılandırıcılar ve Kalıtım Java kuralı: Eğer yapılandırıcının ilk satırında açıkça bir üst sınıfın yapılandırıcısı çağrılmamışsa Java, üstü kapalı olarak alt tarafta super() metodunu işletir ve süper sınıfın yapılandırıcısını çağırır. public Kopek() { strSes = “hav”; } // yapılandırıcı sonu Bunun bir istisnası: zincirleme yapıcı çağırma: this(parametreler) super( ) çağırımını erteler Süper sınıf yapılandırıcısını parametreleriyle birlikte çağırmak için açık olarak çağırma işlemini yapmalısınız: super(strAd) Üstü kapalı olarak Animal() yapılandırıcısı çağırılır.
Burada bir Sekil yapıcısı çağırmak istersem ne olur? Yakın bakış... class Dikdortgen extends Sekil { private int uzunluk, genislik; Dikdortgen () { this(0, 0); } // yapılandırıcı Dikdortgen (int l, int w) { this( l, w, “Dikdörtgen”); Dikdortgen (int l, int w, String n) { uzunluk = l; genislik = l; ad = n; public int alan () { return (uzunluk * genislik); } // alan Burada bir Sekil yapıcısı çağırmak istersem ne olur? Sekil(); Eğer Sekil() yoksa??? Hata
Kalıtım ve Faaliyet Alanları Örnekler super(xxx) // süper sınıfın yapılandırıcısını çağırır super.xxx // süper sınıfın değişkenine erişir super.xxx( ) // süper sınıfın metodu çağırılır this(xxx) // aktif haldeki sınıfın yapılandırıcısı // çağırılır this.xxx // aktif haldeki sınıfın değişkenine // erişilir this.xxx( ) // aktif haldeki sınıfın metodu çağırılır Not: Bunu yapamazsınız: super.super <herhangi birşey> (bunu aslında casting dediğimiz yöntemle yapabilirsniz ancak bu da çok nadir olur, zorunlu olmadıkça yapmamalısınız.)
Zincirleme (Chaining), süper sınıf örneği
class Parent { String name; public Parent() { setName("NONE"); cp(1); } public Parent(String name) { setName(name); cp(2); } public void setName(String name) { this.name = name; cp(3); } public void cp(int n) { System.out.println("At checkpoint "+n+" "+name); } public static void main(String args[]) { Child c = new Child(); } } // Parent class Child extends Parent { public Child() { this("NONAME"); cp(4); } public Child(String name) { cp(5); } } // Child Çıktı: At checkpoint 3 NONE At checkpoint 1 NONE At checkpoint 5 NONAME At checkpoint 4 NONAME
class Parent { String name; public Parent() { setName("NONE"); cp(1); } public Parent(String name) { setName(name); cp(2); } public void setName(String name) { this.name = name; cp(3); } public void cp(int n) { System.out.println("At checkpoint "+n+" "+name); } public static void main(String args[]) { Child c = new Child("Bob"); } } // Parent class Child extends Parent { public Child() { this("NONAME"); cp(4); } public Child(String name) { cp(5); } } // Child Çıktı: At checkpoint 3 NONE At checkpoint 1 NONE At checkpoint 5 Bob
Object Sınıfına geri dönüş Java Object adında temel bir tür sunar extends ifadesine sahip olamayan bütün sınıflar üstü kapalı olarak java.lang.Object sınıfından türerler. Bu gerçeğe ilişkin örnekler: public boolean equals (Object o); public boolean String toString (); Her ne zaman bir sınıfa ait kendi toString() metodunuzu yazsanız aslında Object sınıfı tarafından sağlanan toString( ) metodunu yeniden tanımlamış oluyorsunuz.
Nesne Hiyerarşisi Ya da buna ne dersiniz... Object Hayvan Köpek Kedi İnek Object Çalışan AylıkMaaşlı SaatlikÜcretli Object sınfının metodları: String toString() boolean equals(Object obj) ve diğerleri... Hayvan Köpek Kedi İnek Object Melez Ağır Hafif Ya da buna ne dersiniz...
Sorular?
Sarmalayıcı(Wrapper) Sınıflar Temel türler sınıf değildir (örneğin., int) Ancak bazen temel türleri nesne olarak kullanmamız gereken durumlar olabilir Örnek Toplama sınıfların (collection classes) çoğu Nesnelerden oluşur ve Object sınıfın alt sınıflarıdır Java, temel türlere nesne gibi davranmak için bir takım wrapper sınıfları sağlar (alternatif isimler: a.k.a.(also known as) type wrappers, a.k.a. envelope classes). Bu şöyle sağlanmaktadır: her temel türe ait, özel bir sınıf Bunlar java.lang paketinin içerisindedir, böylece isimler evrenseldir. İsimleri temel türlerin aynısıdır ancak tek farkı ilk harflerinin büyük olmasıdır.
Wrapper Sınıfları Boolean boolean sınıf ait olduğu temel tür Character char Byte byte Short short Integer int Long long Float float Double double Her biri: temel türlere nesne gibi davranmamızı sağlar yararlı çevirici (conversion) metodları içermektedir. Örneğin: Integer sınıfının içerdikleri arasında static Integer valueOf(String s) Integer.valueOf("27") tamsayı 27 ‘ye ait nesne yararlı utility metodlara sahiptir (örneğin, hashing amaçlı)
Wrapper Sınıfları Wrapper ‘ların nesneler ve temel türler arasında bağlantı oluştururken kullanımı // int oluşturma ve ilk değer atama int i = 7; // Bir Integer nesnesi oluşturma ve bir int temel türünü bu nesneye dönüştürme Integer intObject = new Integer( i ); // int temel türünü bu nesneden unwrapping yoluyla çıkarma System.out.println( intObject.intValue() ); // bir string ‘i Integer nesnesine dönüştürmek String strS = "27"; Integer intObject intObject = new Integer (strS); // sonra int temel türüne int a = intObject.intValue(); // birinci yol int b = Integer.parseInt(strS); // ikinci yol
Sorular?