Inheritance — Miras Alma/Kalıtım

yagmurcurku
5 min readNov 2, 2023

--

Object Oriented Programming (OOP) yazısında bahsettiğimiz gibi OOP 4 temel özellik üzerine kurulmuştur. Bu yazımızda bu 4 temel taştan biri olan Inheritance, yani Kalıtım veya diğer bir adıyla Miras Alma hakkında konuşacağız. Keyifli okumalar..

Kalıtım, bir sınıfın özelliklerine sahip yeni sınıflar oluşturmayı sağlar. Örneğin Araç adında bir sınıfımız olduğunu varsayalım, bu sınıftan Otomobil adında bir sınıf türetirsek, Otomobil sınıfı Araç sınıfının bütün özelliklerine sahip olur.

Yani kalıtım tüm alt sınıfların üst sınıflarına ait olan tüm özelliklerini (değişkenlerini ve metotlarını) miras alması anlamına gelmektedir. Bir sınıfa ait tüm nesneler aynı zamanda daha genel yapıdaki başka bir sınıfa ait ise bu iki sınıf arasında kalıtım ilişkisi vardır.

Kalıtımın en büyük avantajı, üst sınıflarda tanımlanmış olan metot ve değişkenleri alt sınıflarda tekrar tekrar yazmaktan bizi kurtarmaktır.

Kalıtım extends anahtar sözcüğü ile gerçekleştirilir. “extends” anahtar kelimesi ile alt sınıf kendi üyelerine ilaveten üst sınıfın üyelerini de içerir.

NOT: Burada vermek istediğim bir detay var. O da, eğer üst sınıfta bir private eleman varsa alt sınıftan bu sınıf miras alınmış olsa dahi o private elemana erişilemeyeceğidir.

Yazımızın buraya kadar olan kısmında Kalıtım hakkında temel bazı bilgiler verdik. Şimdi gelin uygulamalı olarak bir örnek üzerinden birlikte inceleyelim.

Öncelikle “Telefon” isimli bir sınıf oluşturalım ve bu sınıfın “cal” isimli bir metodu olsun. Daha sonra da “AkilliTelefon” isimli bir sınıf oluşturalım ve bu sınıf Telefon sınıfını extends etsin yani kalıtım ile miras alsın.

Telefon.java
AkilliTelefon.java

Bu durumda Telefon sınıfı üst sınıfımız yani SuperClass, AkilliTelefon sınıfı ise alt sınıfımız yani SubClass oldu. Alt sınıfımızda hiçbir metot olmadığını görüyoruz. Şimdi main metodumuza gelip yeni bir akilliTelefon nesnesi oluşturalım ve bu nesne üzerinden nelere erişim sağlanabildiğini görelim.

Main.java

Gördüğümüz gibi akilliTelefon nesnesi üzerinden “cal” metoduna erişim sağlayabildik. Peki bu metot Telefon sınıfının metodu değil miydi? Nasıl oldu da AkilliTelefon sınıfından üretilmiş bir nesne üzerinden bu metoda erişebildik? İşte bu soruların cevabı kalıtımdır. AkilliTelefon sınıfından Telefon sınıfını miras aldığımız için artık üst sınıf olan Telefon sınıfının tüm özelliklerine alt sınıftan erişim sağlayabiliriz (tabii ki bu özellikler private olmadığı sürece).

Console

main metodumuzu çalıştırdığımızda kodumuzun sorunsuz bir şekilde çalıştığını görmekteyiz.

Şimdi örneğimize biraz daha özellik ekleyelim ve oluşabilecek farklı durumları inceleyelim.

Telefon sınıfındaki cal isimli metodu sildik, onun yerine “zilSesiAta” isimli bir metot yazdık. Bu metot, metot çağırıldığında String veri tipinde bir parametre alıyor ve bu parametreyi sınıf değişkeni olan “zilSesi”ne atıyor. Burada kullanılan this.zilSesi sınıf değişkeni olan zilSesi’ni ifade ederken, diğer zilSesi parametre yolu ile alınan zilSesi’ni ifade etmektedir.

Telefon.java

Diğer bir değişikliğimiz de AkilliTelefon sınıfında olacak. Bu sınıfta hiçbir metot bulunmuyordu. Şimdi bu sınıfa “telefonCal” isimli bir metot ekledik ve bu metot içerisinde, Telefon sınıfının değişkeni olan zilSesi’ni kullandık.

AkilliTelefon.java

Şimdi gelelim main metodumuza. Burada AkilliTelefon tipinde bir nesne ürettik ve ismine akilliTelefon dedik. Şimdi burada kalıtımın gücünü göreceğiz. Dikkat ederseniz akilliTelefon nesnesi üzerinden zilSesiAta isimli metot çağırıldı ve bir parametre girildi. zilSesiAta isimli metot AkilliTelefon sınıfının miras aldığı Telefon üst sınıfının bir metodudur. İşte kalıtım sayesinde bu metoda eriştik ve aslında Telefon sınıfının zilSesi isimli değişkenine String bir değer atadık.

Main.java

Daha sonra yine aynı nesne üzerinden telefonCal metodunu çağırdık ve şu şekilde bir çıktı elde ettik.

Console

Görüldüğü gibi zilSesiAta isimli metoda girdiğimiz “ding dong..” String’i üst sınıfın değişkenine atandı ve telefonCal metodunu çağırdığımızda bu değişkeni de telefonCal metodu içerisinde kullanarak bir çıktı elde ettik.

Kalıtım konusunu anlayabilmek için bir tane detaysız, bir tane de yeni özellikler eklediğimiz örnek oluşturduk ve bunları inceledik. Umarım buraya kadar olan kısımları anlamışsınızdır.

Değinmek istediğim bir diğer konu ise Kalıtımda Constructor yapısının nasıl çalıştığıdır. Bu konuda da çok küçük bir örnek verip yazıyı sonlandırmak istiyorum.

Son olarak göstermek istediğim örnek, kalıtım yaptığımızda üst sınıfların ve alt sınıfların constructor’larının nasıl etkilendiğidir. Constructor’ın ne olduğunu hatırlamamız gerekirse bir sınıftan bir nesne oluşturulduğunda yani bir sınıf new’lendiğinde ilk önce o sınıfın constructor metotları çalışır.

Constructor, nesne oluşturulurken başlangıç değerlerini atamak veya başka işlemler yapmak için kullanılan bir metottur. Önceki örneklerimizde neden kullanmadık derseniz Constructor kullanmak zorunlu değildir, ancak bazı durumlarda kullanımı gerekebilmektedir.

Şimdi örneğimize geçelim. “Telefon” adında bir class’ımız ve bu class’ı miras alan “CepTelefonu” isimli bir sınıfımız var. Bu sınıfımızı da miras alan “Samsung” isimli bir alt sınıfımız daha var. Bu 3 sınıfın da constructor metotları mevcut.

Telefon.java
CepTelefonu.java
Samsung.java

main metodumuzda Samsung sınıfından bir nesne oluşturduğumuzda bu sınıfın consturctor’ı çalışacaktır elbette, bunu tahmin edebiliyoruz. Fakat bu alt sınıfın üst sınıflarının constructor’ları bu durumdan nasıl etkilenir? Onların constructor’ları da çalışır mı? Eğer çalışırsa önce hangisinin ki çalışır?

Main.java

Samsung sınıfını CepTelefonu sınıfından, CepTelefonu sınıfını ise Telefon sınıfından üretmiştik. Çıktıda gördüğümüz üzere Samsung sınıfından bir nesne ürettiğimizde öncelikle Samsung sınıfının yapıcı metodu yerine en üstteki sınıfın yapıcı metodu çalışmıştır daha sonra da sırayla alt sınıfların yapıcı metotları çalışmıştır.

Console

Yani bir sınıftan nesne oluşturulduğunda o sınıfın yapıcı metodundan önce türetildiği sınıfın yapıcı metodu çağırılır.

Kalıtımda, yapıcı metotların çalışma mekanizması en üstteki sınıftan en alttaki sınıfa doğrudur.

Umarım keyifli ve açıklayıcı bir okuma olmuştur. Hepinize iyi çalışmalar diliyorum.. ✨

--

--