Ö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

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ış

Son derslerde Java’da sınıf oluşturmanın veya nesne oluşturmanın nasıl gerçekleştiğine, özellikle kalıtımın nesne oluşturmaya nasıl uygulandığına bakmıştık.

Son iki bölümde gördüklerimiz özetle şunlardı. Öncelikli olarak tüm nesnelerin içten dışa doğru yaratıldığını söyleyerek başladık. Son bölümde derleyici kurallarının bunu nasıl gerçekleştirdiğini gördük. Bu arada bu kuralları bilmek istememizin nedeni, kodumuzu rahatlıkla izlememize yardımcı olmasıdır. Aslında bu bölümde, kodumuzda belli başlı hatalar göreceğiz. Bu hataların da bu kuralların uygulanmaması nedeniyle ortaya çıktığını anlayacaksınız.

Şu ana kadar yaptığımız, aslında hiçbir üye değişkeni başlatmadan/ilklendirmeden bir dizi varsayılan kurucu(constructor) oluşturmak oldu. Bu kurucular yaratılırken, alt sınıftan başlayarak, kalıtım hiyerarşisinde en üst sınıf olan Object sınıfının kurucusuna kadar, belli bir sırayla ilerlediğini gördük. Şimdi ise yarım bıraktığımız iş olan değişkenleri ilklendirme işlemine odaklanacağız.

Muhtemelen bir kurucuda daha önce bir değişken başlattınız(yani ilklendirdiniz). Yalnız bu bölümde odaklandığımız şey kalıtım için geçerli olan unsurlardır. Ayrıca sınıf oluşturmaya yardımcı olması için aynı sınıf(same-class) kurucuları ve üst sınıf(superclass) kurucuları kullanacağız.

Geçtiğimiz derslerde verdiğimiz örnek sınıflar olan Person ve Student sınıflarını bu bölümde de kullanalım istiyorum.


Java compiler rule(java derleyici kuralı)


Java compiler rule(java derleyici kuralı)

Person sınfını ele alacak olursak, derleyici, sınıfın miras aldığı bir başka sınıf yoksa arka planda otomatik olarak Object sınıfını miras alıyor ve sınıfın bir kurucusu yoksa bir de sınıfa bir kurucu(constructor) yerleştiriyordu. Hatta 3.derleyici kuralımızı hatırlarsanız, bu kurucu içine bir de super(); metodu çağrısı da eklemişti. Ben bu değişiklikler, sanki derleyici tarafından açıkça eklemiş gibi aşağıdaki kodda belirteceğim. Yalnız bunların derleyici tarafından arka planda eklendiğini unutmayın.

1
2
3
4
5
6
public class Person extends Object {
  private String name;
  public Person(){
    super();
  }
}

Şimdi yapacağımız şey, Person sınıfı içinde bulunan private name değişkenini başlatmak(yani ilklendirmek) için bu varsayılan(default) kurucuyu değiştirmek olacak. Yani değişken başlatmayı, kurucuları oluşturduktan sonra en uygun nasıl başlatabiliriz, ona bakacağız.

Aşağıdaki kodda da görüleceği üzere Person kurucusunu, değişken ilklendirmeye olanak verecek şekilde değiştirdik. Yapıcıya(constructor) n isminde bir String argümanı ekledik. Daha sonra kurucu içinde sınıfın üye değişkenine bu argümanı this.name = n ifadesiyle atadık. Yalnız burada derleyici bir hata verecektir.


Java Variable Initialization(java değişken ilklendirme)

Derleyici kurallarından 3.kuralı hatırlayacak olursak, kurucunun ilk satırı mutlaka aynı sınıf(same-class) yapıcısına veya bir üst sınıf(superclass) yapıcısına bir çağrı olmalıdır. O halde super(); çağrısının yerini değiştirerek bu sorunu çözebiliriz.


Java Variable Initialization(java değişken ilklendirme)

Şimdi hem üst sınıf kurucumu doğru bir şekilde çağırabiliyorum hem de üye değişkenimi başlatabiliyorum. Buradan aslında şu çıkarımı da yapabilirsiniz. Bir sınıftan bir objeyi oluşturmadan veyahut sınıfın kendisini yüklemeden önce derleyici hep bir üst sınıfın sorunlarını çözmemiz için bizi zorlar.

Şimdi benzer değişiklikleri Student sınıfında değişkenleri başlatmak için yapalım istiyorum. Dersin başında Student ve Person sınıflarının derleyici kuralları kapsamında nasıl değiştiğini gösteren 2 şekil göstermiştim. Person sınıfını az önce ele aldığımız için şimdi Student sınıfına odaklanacağız.

Hatırlarsanız, derleyici arka planda bizim yerimize eklediği kurucu ve kurucu içindeki super(); üst sınıf çağrısını yapmıştı. Şimdi bu varsayılan(default) Student kurucusunu ele alıp, üzerinde biraz değişiklikler yapacağım. Haliyle değişiklik yapacağımız için bu kurucunun artık bize özel bir kurucu olacağını unutmayın. Bildiğiniz gibi derleyici, sınıf içinde bir kurucu olmadığı zaman müdahale ediyordu.


Java Variable Initialization(java değişken ilklendirme)

Student kurucusunun içinde, Person kurucusunda yaptığımız gibi benzer ilklendirme işlemini yapalım istiyorum. Eş zamanlı olarak bu kodu bir editörde denediğinizi varsayarak, alacağınız derleme hatalarını birlikte irdeleyebiliriz. İlk gözüme çarpan Person sınıfının içinde argümansız bir kurucunun olmayışı!! İkincisi ise name üye değişkeninin private olması… Hatırlarsanız private değişkenlere getter ve setter yöntemlerle erişebiliyorduk. Yalnız Person sınıfında public olan bir getter/setter yöntemin olmadığını görüyorum. Peki bu durumda ne yapabiliriz? Yani getter ve setter olmadan name isimli üye değişkenini nasıl ilklendirebiliriz? Aşağıdaki gibi bir düzenleme ile bu mümkün…


Java Variable Initialization(java değişken ilklendirme)

Şimdi Student sınıfına tamamen keyfi olarak bir argümansız kurucu eklemek istiyorum. Person sınıfında argümansız bir kurucu olmadığı için super(“Student”) çağrımızın içine bir string eklemem gerekiyor. name değişkenini ilklendirebilmek için “Student” isminde varsayılan bir değer ekliyorum. Bu kod bu şekilde çalışır.


Java Variable Initialization(java değişken ilklendirme)

Daha iyi bir yaklaşım sizce var mı? Evet var.. Çünkü Student sınıfının içinde, argümanlı bir kurucu içinden zaten superclass çağrısı yapılıyor. Tekrardan benzer bir çağrı yapmanın gereği yoktur. Bu gibi durumlarda, aynı sınıf kurucularımı kullanabilirim. Belki de aynı sınıf kurucularımdan biri, tam olarak bu isteğime dayalı bir talebi karşılıyordur. Aşağıdaki kodda yaptığım değişiklik görüleceği üzere, üst sınıf çağrımız olan super("Student"); çağrısını this(“Student”) yapmak oldu. Burada this kullanarak bulunduğumuz sınıfın kurucusunu(constructor) kastettiğimizi anlamışsınızdır.


Java Variable Initialization(java değişken ilklendirme)

Bazı durumlarda bu tarz sınıf içi kuruculara ihtiyaç duyulabilir. Örneğin Person sınıfının ilklendirmesini dışarıdan gelen parametrelerle değil de kendiniz belirlemek isteyebilirsiniz. Örneğin argümanlı kurucunuzu private yapıp, bu kurucuya erişimi sadece argümansız kurucuyla yapabildiğinizi hayal edin. Bu gibi durumlarda this(“”) çağrısı ile sınıf içi bir kurucuya erişebilirsiniz.

Bu arada this(“”) ile this.name kullanımı arasında fark vardır. İlkinde kurucuyu çağırdığınızı belirtiyorsunuz. İkincisinde ise mevcut nesne üzerinde işlem yaptığınızı ifade ediyorsunuz.

Sonuç olarak değişken ilklendirme kısmını da hallettiğimize göre, Java’da nesne oluşturmanın nasıl gerçekleştiğini bir bütün olarak görüyorsunuz.

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