Merhaba arkadaşlar. Bugün yine Java’nın önemli konularından biri olan “Kalıtım”ı ele alacağız. Kalıtım, nesne yönelimli programlamanın önemli konularından biridir. Kalıtım, sınıflar arası bir olaydır. O halde başlayalım :

 

Kalıtım Nedir ?

İngilizce ve orijinal karşılığı “Inheritance” olan, Türkçemize “Kalıtım” olarak geçen ve kullanılan bu yapı; nesne yönelimli programlamanın önemli özelliklerinden biridir. Sınıflar arası bir olay dedik. Evet, kalıtım bir sınıftan farklı sınıflar türetme olarak da açıklanabilir. Teorik olarak ana bir sınıf vardır ve bu sınıf içerisine normal bir sınıf tanımlaması yapılır. Asıl olay daha sonradan üretilen bir başka sınıfın bu sınıfın özelliklerini devralması ve ona yeni özellikler katarak sunmasıdır. İşte bu olaya miras alma, bu yapıya ise kalıtım diyoruz. Elbette bu yapı hiyerarşik bir düzendir ve bu şekilde nesne yönelimli programlamaya bir düzen sağlanmış olur.

Tanımlar konu hakkında fikir sahibi olmanızı sağlar, örnekler ise kavramanızı. Bence programlama öğrenirken kullanılacak örnekler çok önemlidir. (Mesela ben çoğu konuyu örnekleyerek anladım 🙂 ). Bu sebeple bu konuyu örneklendirmek istiyorum. Sınıflar arası kalıtım yaparak genelden özele giden bir yaklaşım izleriz. Nasıl olur bu ? Örneğin “hayvan” adında bir sınıfımız olsun. Bu sınıfımızda çeşitli fonksiyonlar olsun; “solunum yapmak“, “beslenmek“, “uyumak” gibi vs. Daha sonra “kus” adında başka bir sınıfımız olsun. Bu sınıfta da “hayvan” sınıfında olduğu gibi fonksiyonlar olduğunu varsayalım. Fark olarak “kus” sınıfında “ucmak” diye bir fonksiyon daha olsun. Aslında bakıldığında aynı fonksiyonları bir kaç kez yazmak programa bir hantallık katar. İşte tam da bu noktada kalıtım bize yardımcı olur. “kus” sınıfının çoğu fonksiyonu “hayvan” sınıfınınkilerle aynı. İkisini farklı yazmak yerine, “kus” sınıfı “hayvan” sınıfını miras alırsa hem fazla satır koddan kurtulmuş oluruz hem de hiyerarşik bir düzen kurmuş oluruz. İlgili fonksiyonları “hayvan” sınıfı içerisinde tanımlarız. “kus” sınıfı ise “hayvan” sınıfını miras alır ve ekstra olarak “ucmak” fonksiyonunu ekler. Bu örneklemeyi bir de şemalandırırsak :

kalitimSema

Örnekten ve şemadan konu hakkında fikir sahibi olduğunuzu ve mantığını kavradığınızı umuyorum. Şimdi işin kod kısmına geçelim.

Bir sınıf “extends” anahtar sözcüğüyle başka bir sınıfı miras alır. Bu deklarasyon şu şekilde olur :

class sinifAdi extends mirasAlinacakSinifAdi {
                deyimler;
}
 

Miras almanın genel gösterimi bu şekildedir. Şimdi yukarıda örneğini verdiğimiz ve şemasını çizdiğimiz olayı koda dökelim :

ilkOrnek

Öncelikle bu kodu çalıştırdığımızda herhangi bir şekilde bir olay gerçekleşmeyecektir. main metodumuzun içinin boş olduğunu görüyorsunuz. Bu sadece kalıtımın nasıl gerçekleştiğinin kaba bir örneğiydi. Genel yazıma dikkat etmeniz açısından içleri boş sınıflar tanımladım. Miras alma ve dolayısıyla kalıtım işlemi genel itibariyle bu şekilde olur.

———————————————————————————————————————–

ÖNEMLİ NOT :

                BİR SINIF, SADECE 1 TANE SINIFI MİRAS ALABİLİR. Aşağıdaki yazım hatalıdır :

class sinifAdi extends sinif1, sinif2 {
                deyimler;
}

———————————————————————————————————————–

 

Kalıtım Özellikleri

1. Yapılandırıcılar

Sınıflar yapılandırıcılara sahiptir bunu biliyoruz. Her sınıfın bir yapılandırıcısı olduğuna göre temel sınıflarımız ve türetilmiş sınıflarımızın da yapılandırıcıları vardır. Kalıtımda dikkat etmemiz gereken husus şudur : Temel sınıfın yapılandırıcıları önceliklidir. Bir sınıf üzerinden bir nesne oluşturulduğunda ilk olarak ilgili sınıfın yapılandırıcısı çağırılırdı. Ancak ilgili sınıf bir sınıfı miras alıyorsa; ilk olarak miras aldığı sınıfın yapılandırıcısı çağırılır, daha sonra kendi yapılandırıcısı çağırılır. Karmaşık bir cümle olabilir ancak aşağıdaki örnekle konuyu anlayacaksınız :

yapilandiriciOnceligi

Örneğimiz yine gayet basit tutulmuştur. Dikkat etmeniz gerekenler sınıfların yapılandırıcıları ve “kus” sınıfının “hayvan” sınıfını miras almasıdır. main metoduna baktığımızda “kus” sınıfından bir nesne üretiliyor. Ancak çıktımızda ilk olarak “hayvan” sınıfının yapılandırıcısı, daha sonra “kus” sınıfının yapılandırıcısı çağırılıyor.

 

2. Üye Erişimi ve Güvenlik

Bu konuya girmeden önce dilerseniz erişim belirteçlerine hızlı bir bakış yapalım.

Erişim Belirteçleri

                Erişim belirteçleri, program içerisinde bir nevi güvenliği sağlar. Bir değişkenin, metodun, nesnenin vs. ne kadar erişilebilir olduğunu tanımlamamıza yarar. Aşağıda Java’daki erişim belirteçleri ve kapsamları verilmiştir :

erisimBelirtecleri

Sınıf içerisinde, önünde herhangi bir erişim belirteci bulunmayan öğe varsayılan olarak “public“tir.Yani her yerden erişime açıktır. Bu kodlarda istenmeyen bir durumdur. Çünkü önemli bir veri içeren bir değişken dışarıdan kolaylıkla ulaşılabilir, görüntülenebilir ve değiştirilebilir. Ancak public‘in çok işe yaradığı bir çok durum da mevcuttur. Toplayacak olursak kodlarınızda erişim belirteçlerini kullanmanız kodun sağlamlığı ve güvenilirliği açısından iyi yönde etki edecektir. Erişim belirteçlerini de anladığımıza göre kalıtımla olan ilgisini şöyle bir örnekle açıklayalım :

erisimBelirtecleriOrnek

Yine aynı örneğimizde “beslen()” metodunu “private” yaparsak kendi sınıf bloğu dışında gizlemiş oluruz ve ulaşılamaz olur. Kodumuzda da bu yönde bir hata var. Çıktımıza baktığımızda, nesnemizin göremediği “beslen()” metoduna erişmeye çalıştığını anlatan bir hata iletisi vardır. “private” olan “beslen()” metodunu “protected” veya “public” yaparsak veya herhangi bir erişim belirleyicisi yazmazsak hatamız ortadan kalkar. Temel sınıfımızda devredilmesini istemediğimiz öğeleri “private” yaptığımızda, o sınıftan türetilmiş sınıflar öğemizi miras alamaz. Bu şekilde kalıtım yaparken de güvenliği sağlamış oluruz.

 

3. super Anahtar Sözcüğü ve Kullanımı

this anahtar sözcüğünü hatırlarsınız; ilgili sınıfın öğelerine erişmek için kullanılırdı. super anahtar sözcüğü de miras alınan sınıfın öğelerine erişmede kullanılır. Temelde super’in iki kullanımı vardır :

  • Miras alınan sınıfın öğelerine erişmek
  • Miras alınan sınıfın yapılandırıcısını çağırmak

 

3.1 Öğelere Erişmek İçin : ‘super’

Bu konuyu bir örnekle açıklayalım :

superleOgeErisim

Örneğimiz ve çıktımızı inceleyelim. Öncelikle int bir değişkene sahip A sınıfı oluşturulmuştur. Bu sınıfı devralan bir B sınıfı oluşturulmuştur. Yine B sınıfımızın da içinde aynı isimde int bir değişken vardır. B‘deki “i” değişkeni, A‘daki “i“yi ezer ve gizli tutar. Yani programımızda “i“ye bir değer atama yaparsak bu atama, B‘deki “i“ye yapılır. Ancak biz A‘dakine de yapmak istiyoruz, ne yaparız ? İsimleri farklı olsaydı bu tek hamlede olurdu ancak isimler aynı. İşte burada super anahtar sözcüğü imdadımıza yetişir. “super.i=deger” ifadesi A‘daki “i“yi işaret eder ve ona ulaşmamıza yardımcı olur. Yine “goster()” metodunda da A‘daki “i“yi yazdırmak için “super.i” ifadesi yazdığımıza dikkat edin. Bu şekilde miras alınan sınıfın öğelerine super kullanarak erişim sağlarız.

———————————————————————————————————————–

NOT : super’in bu kullanımı genellikle ad çakışmalarında kullanılır. Öğelerin isimleri farklıysa zaten o öğe miras alınır, super kullanmaya gerek kalmaz. Ancak aynı isimlerde; önce öğe miras alınır, daha sonra türetilmiş sınıf içerisinde yine aynı isimde öğe tanımlanırsa, miras alınan öğe ezilir ve gizli tutulur. super tam olarak burada kullanılmalıdır.

———————————————————————————————————————–

 

3.2 Yapılandırıcı Çağırmak İçin : ‘super’

Bilindiği gibi yapılandırıcılar nesneler oluştuğunda otomatik olarak çağırılır. Ancak bazı durumlarda manuel olarak bir çağırım da yapılması gerekebilir. İşte bu durumda temel sınıfın yapılandırıcısı “super” kullanılarak çağırılır. Örneğimizi inceleyelim :

superYapilandirici

Örneğimizde yine “hayvan” adında bir class oluşturduk. Daha sonra içerisinde String türünde bir değişken deklare ettik ve yapılandırıcısını tanımladık. Bu yapılandırıcıya göre sınıfımız, int ve String değişkenler alarak bize bir nesne oluşturuyor. Yine “kus” adında bir class daha oluşturduk ve bu classhayvanclass‘ını miras olarak aldı. İçerisinde “static” olarak int tipte bir değişken deklare edilmiş. (“static” anahtar sözcüğüne şimdilik takılmayın daha sonra inceleyeceğiz). Bu sınıfın yapılandırıcısı da bir String değişken alır. Bu yapılandırıcıya girdiğimizde yabancı bir ifadeyle karşılaşırız. İşte bu ifade super‘in ikinci kullanımı olan miras alınan sınıfın yapılandırıcısını çağırmaya yarar. “kus” sınıfı yapılandırıcısı, String olarak bir değer alır ve bu değere kendi içerisindeki int değişkeni de ekleyerek miras aldığı sınıfın yapılandırıcısını çağırır. main metodumuza geldiğimizde, yeni bir “kus” nesnesi oluşturulduğunu görüyoruz. String değer olarak “Serçe” girilmiş ve işlenmiştir. Kodun çalışma basamaklarını da verelim mantığını tamamen kavramamıza yardımcı olsun :

  • Kodumuz 21. satırdan çalışmaya başlar.
  • satırda “kus” nesnesi oluşturulur.
  • “hayvan” sınıfının sadece String alan yapılandırıcısı olmadığından 15. satır çalışır.
  • satır kod bloğuna girer ve 16. satırda “hayvan” sınıfı yapılandırıcısı çağırılır ve 6. satıra gelinir.
  • satırda parametre olarak alınan String ifadesi, class içindeki String değişkene atanır.
  • satırda da konsola çıktı yazılır.

Bu şekilde program tamamlanır.

 

 

Evet arkadaşlar, yazımızı burada sonlandıralım. Ancak kalıtım konusu henüz bitmedi. Bir dahaki yazımızda yine devam edeceğiz. Burada kesmemin sebebi hem yazının uzunluğu hem de konunun kavranması için. Yazı daha fazla uzun olunca insanların gözü korkar ve zamanla sıkılmaya başlar. Sıkıntı başlayınca da öğrenme zayıflar. Bu sebeple yazılarımı belli bir kelime sınırında tutuyorum. Maksimum 1200-1300 kelimelik bir sınır bu. Konu tam bitmedi ama şimdiden sınırı geçtik bu nedenle kesmeliyim : Her şey sizin için arkadaşlar 🙂 Konuyu buraya kadar kavramanız için bir kaç kez çalışabilirsiniz. Aslında o kadar zor bir yanı yok, ancak temeli sağlam tutmak adına bunu yapmalısınız. İleride öyle kodlarla karşılaşacaksınız ki kafanız karışacak, tıkanacaksınız. Bunu bir nebze engellemek adına basit düşünmenizi ve her özelliği temelini ele alarak incelemenizi öneririm. Bir dahaki yazıya kadar kendinize iyi bakın görüşmek üzere 🙂

 

Bilgi paylaştıkça çoğalır..
Herkese bol Javalı günler ! 🙂

Facebook'dan yorumla