ÖNEMLİ : Kendim için aldığım notlar. Umarım size de bir faydası olur. Kullanılan her bir makale referans olarak eklenmiştir.

Java’da Kalıtım(inheritance) ve Java’da Polimorfizm Serisi


  1. Java’da Kalıtım 1 - Kalıtımı Neden Kullanırız? Kalıtımı Sağlamak İçin Asgari Şartlar Nelerdir?
  2. Java’da Kalıtım 2- Extends
  3. Java’da Kalıtım 3 - Referans ve Nesne Tipleri
  4. Java’da Kalıtım 3.1 - Static ve Dinamik Tür
  5. Java’da Kalıtım 4 - Görünürlük/Erişim Değiştiricileri
  6. Java’da Kalıtım 5 - Java’da Nesne Oluşturma
  7. Java’da Kalıtım 6 - Sınıf İnşası İçin Derleyici Kuralları
  8. Java’da Kalıtım 7 - Sınıf Hiyerarşisinde Değişken İlklendirme
  9. Java’da Kalıtım 8 - Alıştırmalar
  10. Java’da Kalıtım 9 - Overriding(Ezici) Metotlar
  11. Java’da Kalıtım 10 - Overloading(Aşırı Yükleme) Metotlar

Genel Bakış

Aşağıdaki sorularda bir önceki derslerde öğrendiklerimizi pekiştirmeye çalışacağız. Lütfen önce koda bakarak kendiniz çözmeye çalışın. Bu çok daha yararlı bir egzersizdir. IDE kullanarak çözmeye çalışmak kodun çalışma mantığını anlamanıza yardımcı olmaz. Kalem kâğıt kullanabilirsiniz.

Örnek 1

1
2
3
4
5
6
7
8
9
10
11
12
public class Student extends Person {

    public Student (String n) {
        super(n);
        System.out.println("3");
    }

    public Student() {
        this("Student");
        System.out.println("2");
    }
}
1
2
3
4
5
6
7
public class Person {
    private String name;
    public Person( String n ) {
        this.name = n;
        System.out.println("1");
    }
}

Yukarıdaki kod bloğununda önceki derslerden alışık olduğumuz Person ve Student sınıfları yer almaktadır. Aşağıdaki main metodu içinde yer alan kod çalıştırılmak istendiğinde komut ekranında nasıl bir çıktı ile karşılaşırız?

1
2
3
public static void main(String[] args) {
      Student s = new Student();
}
  • Görüleceği üzere; new Student() argümansız bir Student constructor’ı çağrılmaktadır.
  • Student sınıfının argümansız metodunun ilk satırında this("Student") Student sınıfının argümanlı kurucusuna bir çağrı bulunmaktadır. Daha metoda girer girmez bizi argümanlı kurucuya(constructor) yönlendirmektedir.
  • Argümanlı kurucu ise this("Student") çağrısından aldığı “Student” isimli string argümanı, argümanlı kurucunun ilk satırında yer alan super(n) çağrısı ile Person sınıfının argümanlı kurucusuna taşır.
  • Person kurucusunun ilk satırı her ne kadar this.name = n olsada biz biliyoruz ki derleyici buraya bir super() çarğısı ekleyecektir. Çünkü önceki derslerden de bildiğimiz üzere derleyici kurallarından 3.kural, kurucunun 1. satırında ya aynı sınıf kurucusunu çağıran bir this(argsopt) ifadesi olacak ya da bir üst sınıf kurucusunu çağıran bir super(argsopt) ifadesi olacak diyordu. Bunların ikiside yoksa java derleyicisi super() çağrısını ekleyeceğini belirtiyordu. Bu sebepten ötürü biz görmesek de java arka planda bu çağrıyı yapar. Amaç Object sınıfına kadar ulaşıp, oradan değişkenleri ilklendirerek geri dönmek.
  • Person kurucusu içinde taşınan bu argüman, Person sınıfı üye değişkenine this.name = n atandıktan sonra,

    1
    
      System.out.println("1");
    

    ile komut satırı ekranına “1” yazdırılır.

  • Person kurucusu ile işimiz bitince, bu kurucuya nereden ulaştıysak oraya geri dönmemiz gerekecektir. Bu kurucuya Student sınıfının argümanlı constructor’ından geldiğimizi biliyoruz. Orada kaldığımız satırdan devam ederiz. Karşımıza bir;

    1
    
      System.out.println("3");
    

    işlemi daha çıkmaktadır. Ekrana sonuç olarak “3” yazdırılır.

  • Bu kurucuda da işimiz bittiğine göre buradan çıkmamız gerekecektir. O halde bu kurucuya nereden geldiğimize bakarız. Hatırlayacak olursak bu kurucuya Student sınıfının argümansız kurucusundan gelmiştik. Burada da yarım kalan bir işlemimiz bizi beklemektedir.
    1
    
      System.out.println("2");
    

    satırı ile ekrana “2” yazdırırız ve main metodu içinde başladığımız yere geri döneriz.

  • Sonuç olarak ekrana 1, 3, 2 yazdırılır.

Örnek 2

1
2
3
4
5
6
7
8
9
10
11
public class Person {
    private String name;

    public Person( String n ) {
        super();
        this.name = n;
    }
    public void setName( String n ) {
        this.name = n;
    }
}
1
2
3
4
5
public class Student extends Person {
    public Student () {
        this.setName("Student");
    }
}
1
2
3
public static void main(String[] args) {
      Student s = new Student();
}

Benzer şekilde main metodu içinde bulunan kod bloğu çalıştırılmak istendiğinde hangi sonucu alırız.

  • Benzer şekilde new Student() kodu ile Student sınıfının argümansız kurucusu çağrılmaktadır. Student kurucusu içinde

    1
    
      this.setName("Student");
    

    ifadesi ile karşılaşmaktayız. Her ne kadar ilk olarak bu satır ile karşılaşsak da biliyoruz ki derleyici bizim yerimize arka planda super() çağrısını kurucunun ilk satırına ekleyecektir. Çünkü önceki derslerden de bildiğimiz üzere derleyici kurallarından 3.kural, kurucunun 1. satırında ya aynı sınıf kurucusunu çağıran bir this(argsopt) ifadesi olacak ya da bir üst sınıf kurucusunu çağıran bir super(argsopt) ifadesi olacak diyordu. Bunların ikiside yoksa java derleyicisi super() çağrısını ekleyeceğini belirtiyordu. Bu sebepten ötürü biz görmesek de java arka planda bu çağrıyı yapar.

  • Yalnız şöyle bir sorun var. Student sınıfının bir üst sınıfı, yani miras aldığı sınıf olan Person sınıfı argümansız bir kurucuya sahip değildir. Bu sebepten ötürü derleme hatası alırız.

Son soruda Java derleyicisi arka planda neden bir argümansız kurucu eklemedi diye düşünebilirsiniz. Sebebi şudur: Hali hazırda argüman alan bir kurucunuz varsa, compiler insiyatifi size bırakır. Bu durumda derleme hatası almak istemiyorsak, argümansız kurucuyu ek olarak bizim elle eklememiz gerekmektedir.

Not:


Not : Hazırladığım java’da kalıtım serisini sıralı takip etmiyorsanız bazı şeyler havada kalacağı için aşağıdaki videoyu izlemenizi öneririm.

Aşağıdaki hazırladığım java eğitim videosunda, main metodunu da kapsayan bir örnek kod üzerinde, statik ve statik olmayan değişken ve metotların hafıza yönetim modelini ele aldım.

Referanslar