Inheritance Nedir?
Kalıtım kavramı nesneye yönelik programlamanın üç önemli kavramlarından biridir. Diğer ikisi polymorphsim ve interface’dir.
Adından da anlaşılacağı üzere kalıtım, atadan oğula bırakılandır. Nesneye yönelik programlamada ifade edersek: kalıtım, bir sınıftan(üst sınıf/super class) başka bir sınıfa miras bırakılandır. Java programlamada ise bir oğulun yalnızca bir ata sınıfı olabilir.
Ata sınıfı içinde public Kurucu() metodu çağırılınca konsola “Ben Ata Kurucuyum.” metni yazılıyor. Ayrıca yine aynı sınıf içerisinde Yazdir() metodu mevcut ve çağırılınca “Ata Sınıfındayım” metnini konsola yazıyor.
Ogul sınıfında ise daha önce görülmemiş bir anahtar sözcüğünü görüyoruz.
extends anahtarının açıklaması: Ogul sınıfı, Ata sınıfından miras alıyor. Ogul extends Atanotasyonunda Ogul miras alan, Ata ise miras bırakandır. Kalıtım esnasında bu iki sınıf arasına extendsanahtar sözcüğünün yazılması zorunludur.
Bu iki sınıfın kodlarını çalıştıracak olan Main() sınıfı içindeki Main() metot, Ogul sınıfından bir nesne yaratıyor.
Nesne yaratıldıktan sonra, Ogul sınıfının Yazdir() metodu çağırılıyor.
Oysa ki tanımlamada Yazdir() metodu Ogul sınıfına ait değil, Ata sınıfına aittir. Ama Ogul sınıfa miras kaldığı için, onu kendi metoduymuş gibi kullanır. Böylece Ata sınıf içindeki Yazdir() metodu “Ata Sınıfındayım” metnini konsola yazdırır.
NOT : Üst sınıfın değişkenleri ve metotlar public ya da protected erişim belirleyici ile tanımlandığında alt sınıfa miras kalabilir ya da bir başka ifade ile kalıtım ile aktarılabilir.
Başka Bir Örnek
Aşağıdaki Ogrenci sınıfında public değişkenler alt sınıfı olan UniversiteOgrencisi sınıfına miras kalır.
Alt sınıftan(sub-class) bir nesne oluşturduğumuzda bu değişkenlere erişebiliriz.
Daha önceden Default Yapılandırıcı hakkında bahsetmiştik. Biz yazmasak da parametre kabul etmeyen bir yapılandırıcı Object sınıfından bize miras kalmaktaydı.
Bir alt sınıfta yapılandırıcı içerisinde super() ifadesiyle üst sınıfın yapılandırıcısı çağrılmaktadır.
Ogrenci sınıfına yeni bir yapılandırıcı yazdığımızda ise default yapılandırıcıyı kaybediyorduk ve eğer bu parametresiz yapılandırıcıyı kullanmak istiyorsak açıkça yazmamız gerekiyordu.
Dolayısıyla üst sınıfımız Ogrenci sınıfına yukarıdaki yapılandırıcıyı yazarak ve main metodunu yukarıdaki gibi güncelleyerek bir Ogrenci nesnesi oluşturabiliriz.
Ancak alt sınıfımızın default yapılandırıcısı super() ile üst sınıfın yapılandırıcısını çağırıyordu. Bu yüzden bir hata mesajı alacağız. Bunu düzeltmek için iki tercihimiz var.
İlki; yukarıdaki main metodunu değiştirmeyeceksek üst sınıfın içerisine aşağıdaki gibi default yapılandırıcıyı yazarız.
İkinci çözümde ise üst sınıfı değiştirmemize gerek yoktur. Alt sınıfa aşağıdaki yapılandırıcıyı yazıp, main metodunu güncelleriz.