Java Inheritance

ratio

Kıdemli Üye
6 Tem 2013
2,456
6
Turk
Java Inheritance

Türkçe karşılığı ‘miras’ olan inheritance nesneyle yönelik programlamanın üç önemli kavramından bir tanesidir. Miras kavramı hakkında biraz konuşmak gerekirse, java’da miras kavramı ebeveyn (ata sınıf, super class) sınıfının çocuk (oğul sınıf, sub class)’ sınıfına içerdiği özellikleri ve fonksiyonları miras bırakması diyebiliriz.

Peki. Bu miras kavramı ne işimize yarayacak?

Miras kavramı basit seviyede kod yazılırken bile ihtiyaç duyulan bir yapıdır. Basitce anlatmamız gerekirse bir proje yapılırken pek çok sınıfda aynı değişkenler ve metotlar bulunabilir bu durumda daha önceden yazılmış kod parçalarının tekrar tekrar farklı sınıflarda yazılmasının önüne geçmek amacıyla sınıflar birbirlerinden türeyebilirler. Bu işlem iş yükü kaybını önler ve bize zaman kazandırır. Üst sınıfların test edilmiş olduğu düşünüldüğü için dışarıdan bakıldığında güven verir. Ayrıca kalıtımın olmaması ve if-else switch-case durumlarının olması veya kalıtımın basamaklarının çok uzun olması yine kötü bir tasarıma neden olur. Bunun yerine uygun yerlerde kalıtım kullanmak çok daha mantıklıdır.

Biraz daha derine inelim.

Java inheritance aslında java’nın temelinde var olan bir yapıdır. Java’da kullanılan tüm sınıflar Object sınıfından türetilmiştir. Yani Object sınıfını bütün sınıfların atası veya super class’ı diyebiliriz. Bunun sayesinde Object sınıfındaki bütün özellikleri ve fonksiyonları sorunsuz şekilde kullanabilmekteyiz. Bunu test etmek veya kullanmak amacıyla, bir sınıfın değişken tipini bilmediğimizde bu sınıfı ‘new’ operatörüyle Object sınıfına eşitleyebiliriz.

Inheritance’ı kullanmaya başlamadan önce Java’nın bize koyduğu ve dikkat etmemiz gereken bazı kurallar var.

1- Object sınıfı hariç bir sınıf başka bir sınıfdan miras alacaksa el uzatmak manasına gelen ‘extends’ sözcüğü sınıf tanımlanırken kullanılmak zorundadır.
Kod:
[CENTER][LEFT]public class GreenTeam extends TurkHackTeam { } 

public class Mercedes extends Araba { }[SIZE=4][COLOR=White][FONT=Calibri][/FONT][/COLOR][/SIZE][/LEFT]
[/CENTER]
Açıklamak gerekirse green team, türk hack team’in bir alt timidir ve turk hack team’in özelliklerini taşımaktadır ya da Mercedes bir arabadır. Ayrıca burada IS-A yani ‘dır, dir’ ilişkisi vardır. Mercedes bir arabadır dediğmizde mercedes araba sınıfının private olarak tanımlanmamış yani public veya protected olan bütün özelliklerini alacaktır.

2- Bir sınıfın sadece tek bir atası vardır. Ama bir atanın birden fazla çocuğu olabilir.

Bu noktada mercedes bir arabadır ve audi’de bir arabadır örneklerini verebiliriz.

Resimde gördükleriniz Java’daki inheritance çeşitleridir.



Peki Java’da neden Multiple ve Hybrid inheritance yoktur?

Şöyle bir senaryo düşünelim, C sınıfı A ve B sınıfından miras almış olsun. Hem A hem de B sınıfı Yürü adlı bir metoda sahip olsun. C sınfıından bir obje oluşturulduğunda ve Yürü metodu çağırıldığında bu metot A’dan mı çağırılacak, yoksa B’den mi? Compile-time hataları, run-time hatalarından iyidir. Bu yüzden Java’nın temeli olan sade ve kolay kod yazılabilmesi için multiple ve hybrid inheritance kullanılmaya çalışıldığında Compile-time hatası alırsınız.



3- Bir alt sınıf ne zaman bir üst sınıfa erişmek isterse super anahtar sözcüğünü kullanabilir. Constructor (yapılandırıcı) çağırıldığında ilk iş nesneyi yaratmaktır bu yüzden super anahtar kelimesi constructor’ın (yapılandırıcının) en başında olmak zorundadır.

Üst sınıftaki bir değişken ya da metot alt sınıfta aynı isimle üretildiğinde bu olaya hiding( gizleme) denir. Temiz ve sürdürülebilir bir kod için kullanılmamalıdır.

Burada super anahtar kelimesi üst sınıfa ait nesne yaratmak için (3.1) veya üst sınıfın öğelerine erişmek (3.2) için kullanılabilir.

3.1- Bir alt sınıf super() metodunu kullanarak bir üst sınıfın nesnesini yaratabilir ve onun değişkenlerine değer atayabilir.

3.2- Bir alt sınıf Super() moetodu ile bir üst sınıftan nesne yaratmadan onun öğelerine erişebilir.

4- Overriding, Üst sınıf içerisindeki bir metot ile aynı isimde bir metot alt sınıf içerisinde üreiltidiğinde bu olay üzerine yazma (overriding) olarak adlandırılır. Overriding yapılırken metotun içeriği alt sınıfa göre düzenlenebilir.

Overriding yapılan metotun bir üst satırına override’ yazılarak compiler tarafından üst sınıfta metotun var olup olmadığı kontrol edilebilir.

Bir örnek üzerinden hepsini gösterelim;
Kod:
[CENTER][LEFT]// Öncelikle burada isim, kilo ve boy özelliklerine, iki constructor ve bir metoda sahip bir insan sınıfı oluşturduk. 

class İnsan { 

    String isim; 

    int kilo; 

    int boy; 

 

    İnsan( İnsan insan) { 

        isim = insan.isim; 

        kilo = insan.kilo; 

        boy = insan.boy; 

    } 

     

    İnsan( String isim, int kilo, int boy) { 

        this.isim = isim; 

        this.kilo = kilo; 

        this.boy = boy; 

    } 

     

    public **** yemekYe() { 

        kilo = kilo + 5; 

    } 

} 

  

// Burada Çocuk “IS-A” insandır diyerek çocuk sınıfı için insan sınıfını miras olarak aldık. 

class Çocuk extends İnsan { 

    int sınıf; 

    // Constructor’da super() metodunu kullanarak bir üst sınıfın özelliklerini çağırdık. 

    Çocuk( String isim, int kilo, int boy, int sınıf) { 

        super( isim, kilo, boy); 

        this.sınıf = sınıf; 

    } 

    // Burada bir üst sınıftaki metodun üzerine yazarak onu alt sınıfımız için yeniden düzenledik. 

    [USER=277185]over[/USER]ride 

    public **** yemekYe() { 

        kilo = kilo + 2; 

    } 

     

    **** yeniSınıf() { 

        sınıf++; 

    } 

} 

 // Burada farklı bir sınıf oluşturduk ve birden fazla sınıfın tek bir aynı sınıftan miras alabileceğini göstermek istedik. 

class Baba extends İnsan { 

    int yaş; 

     

    Baba( String isim, int kilo, int boy, int yaş) { 

        super( isim, kilo, boy); 

        this.yaş = yaş; 

    } 

} 

 // Main class’da  her metodun kendi sınıfındaki yeniden yazılmış veya kendi sınıfına ait  metotları kullandığını yok ise şayet miras aldığı sınıftakini olduğu  gibi kullandığını gösterdik. 

public class Main { 

    public static **** main( String[] args) { 

    // Öncelikle İnsan sınıfının değişken ve obje parametreli iki yeni objesini oluşturduk. 

    İnsan insan = new İnsan( "Ali", 80, 180); 

    İnsan insan2 = new İnsan( insan); 

   // Daha sonra İnsan sınıfının alt sınıfları olan Çocuk ve Baba sınıfının yeni objelerini oluşturduk. 

    Çocuk çocuk = new Çocuk( "Veli", 50, 150, 5); 

    Baba baba = new Baba( "Veli'nin Babası Ahmet Bey", 70, 185, 39 ); 

  

// Öncelikle hepsinin başlangıç değerlerini bastıralım. 

    System.out.println( "İsim:" + insan.isim + " kilo:" + insan.kilo + " boy:" + insan.boy); 

    System.out.println( "İsim:" + insan2.isim + " kilo:" + insan2.kilo + " boy:" + insan2.boy); 

    System.out.println( "İsim:" + çocuk.isim + " kilo:" + çocuk.kilo + " boy:" + çocuk.boy + " sınıf: " + çocuk.sınıf); 

    System.out.println( "İsim:" + baba.isim + " kilo:" + bab****ilo + " boy:" + baba.boy + " yaş:" + baba.yaş); 

// Burada babanın sınıfında yemekYe metodunun olmadığını yani bunu üst sınıfı olan İnsan sınıfından direkt olarak aldığına dikkat ediniz. (Java Inheritance) 

    baba.yemekYe(); 

    System.out.println(); 

// Babanın değişkenlerinin yeni değerlerine bakalım. 

    System.out.println( "İsim:" + baba.isim + " kilo:" + bab****ilo + " boy:" + baba.boy + " yaş:" + baba.yaş); 

// Burada insan ve çocuk sınıfına yemekYe metotlarını kullandırtarak override’ı göstermek istedik. Aynı metot iki sınıfta farklı çalışmaktadır. 

    System.out.println( "insan sınıfı çıktıları"); 

    insan.yemekYe(); 

// Yeni değerleri bastıralım. 

    System.out.println( "İsim:" + insan.isim + " kilo:" + insan.kilo + " boy:" + insan.boy); 

        System.out.println(); 

    System.out.println( "çocuk sınıfı çıktıları"); 

    çocuk.yemekYe(); 

// Burada çocuğun kendi sınıfına ait bir metot çalıştırarak göstermek istedik. 

    çocuk.yeniSınıf(); 

// Yeni değerleri bastıralım. 

    System.out.println( "İsim:" + çocuk.isim + " kilo:" + çocuk.kilo + " boy:" + çocuk.boy + " sınıf: " + çocuk.sınıf); 

} 

} [/LEFT]
[/CENTER]
 
Moderatör tarafında düzenlendi:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.