Ö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ı iç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

Video İçeriği

Okumayı sevmiyorsanız aşağıdaki 3 videoyu izleyebilirsiniz. Videoları izlemek için aşağıdaki resimlere ya da sırasıyla bu linklere 1, 2, 3 tıklayabilirsiniz.


Java'da Derleyici Kuralları 1 - this() ve super() kurucu çağrıları & Overloaded constructor Management

Java'da Derleyici Kuralları 2 - Java'da Nesne Oluşurken Nasıl Bir Yol İzlenir?

Java'da Derleyici Kuralları 3 - Java'da Nesne Oluşumuna Bir Örnek?

Genel Bakış

Bu bölümde işleyeceklerimiz, tüm nesnelerin aslında Object sınıfından türetildiğini, özünde bu sınıfı miras aldığını tanımak olacaktır. Bununla beraber, Java’da nesnelerin içten dışa nasıl inşa edildiğini görecek ve sonrasında örnek değişkenlerin Object sınıfından başlayarak nasıl başlattığına(initialization) bakacağız.

Java’da nesnelerin içten dışa nasıl inşa edildiğini gördük.


Java inheritance (java kalıtım)

Aşağıdaki şekilde gördüğünüz kod bloğundaki new ahantar kelimesi aslında bir operatördür. Bu operatör, burada alan ayırmak anlamına gelir. Sonrasında this hemen bu alana, yani constructor’a verilir. Yani “this” kurucunun(constructor) başlaması(initialization) için bu alana referans olarak geçer. Aslında yapıcılar(constructor) başlatıcılar(initializers) olarak adlandırılmalıdır çünkü diğer programlama dillerinde aslında init olarak adlandırıldığını göreceksiniz.

Not:


Bir örnek yöntemi veya bir kurucu içinde this, geçerli nesneye (yöntemi veya kurucusu çağrılan nesne) bir referanstır.

this komutunu kullanarak bir örnek yönteminden veya bir kurucudan geçerli nesnenin herhangi bir üyesine başvurabilirsiniz.


Java new keyword and java this keyword (java new anahtar kelimesi ve java this anahtar kelimesi)

Konumuza geri dönecek olursak, burada Student kurucusunun yaptığı, öğrenciyle ilişkili değişkenleri başlatmaktır. Ve bunu yapmanın yolu aslında içten dışa doğru yol almaktır. Çünkü nesneler içten dışa doğru oluşturulurlar. Hiyerarşiye göre Object sınıfına kadar gider ve sonra başladığınız sınıfa geri dönersiniz. Geri döndükçe ilgili tüm değişkenleri başlatırsınız(yani ilklendirirsiniz, yani atama işlemlerini yaparsınız:)).

Sınıf Yükleme

Sınıf yükleme ile nesne oluşturma aynı şey gibi gözükebilir ama aynı değildir.

Not:


Herbir sınıf heap alanına statik metot ve değişkenleriyle bir kez yüklenir. Ama statik bu değişkenler sonrasında güncellenebilir.

Yüklemek ile güncellemeyi karıştırmayalım. Statik bu metot ve değişkenler, statik initializers olarak da bilinir. Sınıfın hafızası olarak da düşünebilirsiniz. Sınıftan yaratılan bütün objelerle ortak paylaşıldığı için bu tanımlama kullanılır.

Ama şunu bilmekte de yarar var. Bir bir sınıftan bir nesne oluşturmadan önce, sınıfın kendisi statik değişken ve metotlarıyla beraber tek seferliğine heap alanına yüklenir. Bu örnekten yola çıkarsak, Student sınıfından bir obje oluşturmaya teşebbüs ettiğimizde daha new anahtar kelimesine(yani obje oluşturmaya) odaklanmadan önce, Student sınıfının miras aldığı bir sınıfın olup olmadığına bakılır. Herhangi bir işlem yapmadan Person sınıfına gideriz.

Aynı soruyu Person sınıfı için de sorarız. Person sınıfının miras aldığı bir sınıf var mı? Görünüşte yok. Ama biliyoruz ki dolaylı olarak Object sınıfını miras alıyor. O yüzden hiçbir işlem yapmadan Object sınıfına gideriz. Sonrasında ise Object sınıfının statik metot ve değişkenleri(varsa) heap alanına yüklenir. Sonra Person sınıfına geri döner ve aynı işlemleri burada da yaparız. Yani Person sınıfının statik metot ve değişkenleri(varsa) heap alanına yüklenir. Son olarak Student sınıfına geri döner ve aynı işlemleri burada da yaparız. Yani Student sınıfının statik metot ve değişkenleri(varsa) heap alanına yüklenir.

Bu işlemler yani sınıf yükleme işlemleri bittikten sonra new operatörü ile bir obje oluşturma işlemine geçeriz. Buradaki işlemler de sınıf yüklerken yaptığımıza benzerdir. Önce miras aldığı sınıfların(ta ki Object sınıfına kadar) instance metot ve değişkenleri(yani statik olmayanlar) bu objenin içinde ilklendirilir. En son Student sınıfınınkiler ilklendirilir ve obje oluşturma işlemi biter. Aşağıda sadece obje oluşturma kısmı resmedilmiştir. Ama öncesinde sınıfların heap’e yüklendiğini bilmeniz gerekmektedir. (Bu kısmın iyice anlaşılabilmesi için sayfanın sonunda hazırladığım bir videoyu bulacaksınız. Bu video konunun daha iyi anlaşılmasına yardımcı olacaktır.)

Sınıf yüklendikten sonra o sınıftan defalarca obje oluşturabilirsiniz.

Not: Bir sonraki ders bu konuyla ilgili birkaç bilgi daha vereceğim.

Nesne Oluşturma

Bu işlemin nasıl gerçekleştiğini anlamak için adım adım ilerlememizde yarar var.

new operatörü ile bir obje alanı(boşluğu) yarattık. Sonrasında ise bu alana(boşluğa) constructor aracılığı ile girdik. Aşağıdaki şekilde görebilirsiniz.


Java class hierarchy or java inheritance tree (java sınıf hiyerarşisi veya java kalıtım ağacı)

Akabinde ilk kod satırı olan Student yapıcısı/kurucusu(yani constructor), bizi superclass yapıcısına gönderecektir. Bu durumda Person’dan bahsettiğimizi anlamışsınızdır.


Java class hierarchy or java inheritance tree (java sınıf hiyerarşisi veya java kalıtım ağacı)

Person() kurucusunun ilk kod satırı da bizi hemen indirect superclass kurucusuna, yani bu durumda Object’e gönderecektir.


Java class hierarchy or java inheritance tree (java sınıf hiyerarşisi veya java kalıtım ağacı)

Şimdi, Object() yapıcısı object ile ilişkili değişkenleri başlatabilir. Indirect superclass yazan yeri Object() yapıcısının o alanı başlattığını göstermek için yeşile boyamak istiyorum.


Java class hierarchy or java inheritance tree (java sınıf hiyerarşisi veya java kalıtım ağacı)

Tamamlandığında java, Person() kurucusuna geri döner ve Person ile ilişkili değişkenlerini başlatır.


Java class hierarchy or java inheritance tree (java sınıf hiyerarşisi veya java kalıtım ağacı)

Ve sonra Student() kurucusuna geri döner ve Student ile ilişkili değişkenlerini başlatır.


Java class hierarchy or java inheritance tree (java sınıf hiyerarşisi veya java kalıtım ağacı)

Bu süreç boyunca aslında tüm bu değişkenleri başlattık, hatta nesneye kadar gidip geri döndük. Aslında içten dışa ilklendirmeden bunu kastediyorduk. Ama değişken ilklendirirken de izlenilen kuralları bilmemiz gerekecek. Bu sebepten ötürü, bu bölümden 2 ders sonrasında bu kuralları ele alacağız. Sabırla ilelemenizi öneririm.


Java class hierarchy or java inheritance tree (java sınıf hiyerarşisi veya java kalıtım ağacı)

Burada şu soruyu sorabilirsiniz. Object sınıfını extends etmediğimiz halde java bunu nasıl biliyor? Bir sonraki bölümde bunun cevabını bulmaya çalışalım. Bu arada burada anlattıklarım belki kafanızda tam oturmamış olabilir. O yüzden aşağıdaki videoyu izlemenizi şiddetle öneririm.

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.

Özet

Nesneleri oluştururken, alt sınıf kurucuları, üst sınıf kurucularını hiyerarşik sırada Object sınıfına ulaşana kadar çağırır, sonrasında örnek değişkenleri Object sınıfından başlayarak ve alt sınıfınıza giden miras hiyerarşisinde aşağı doğru ilerleyerek başlatılırlar. (Bu nedenle hiyerarşide en alt sınıfınızdaki örnek değişkeni en son başlatılır.)

Referanslar