Previous
Next

JAVA - Inheritance(Kalıtım) nedir?

by Cem Kefeli 28. Kasım 2010 03:44

JavaDaha önce nesneye yönelik bir dilin olmazsa olmazlarından birisi olan kalıtım(Inheritance) konusundan "Polymorphism nedir?" başlıklı yazım içerisinde bahsetmiştim. Çünkü çok biçimlilik(Polymorphism) kalıtım ile oldukça iç içe geçmiş ve kalıtımın yok açtığı doğal sonuçların bir uygulaması olarak göze çarpmaktadır. Dolayısı ile kalıtımın olmadığı bir ortamda çok biçimlilikten söz etmek olanaksızdır.

OOP(Object Oriented Programming) diyorsak nesnelerden bahsediyoruz demektir. Herşey nesne olarak düşünülebilir. Nesneler ise birbirlerinden türeyebilmektedir. Örneğin bir ana sınıf düşünün aklınızda, bir de bu ana sınıfın yavrucuklarını düşünün. Yavrucukları diyorum ama, bunu yavru sınıflar daha küçüktür, daha az öğe içerir gibi düşünmeyin sakın. Tam tersine bu yavrucuklar daha gelişkin olabilirler. Annelerinin tüm özelliklerine sahip olurlar da, hatta bir de annelerinden farklı başka özellikler de içerebilirler. Bu yavrucukların da yavrucukları olabilir. Bu böyle devam eder gider. Hemen aşağıda kalıtımın olduğu bir ortamdan ve bunun uygulamalarından bahsetmeye çalışacağım.

Sağ tarftaki UML diagramında bir kalıtım yapısı bulunmakta. TASIT ana sınıfı(Base class) BenNeyim isminde bir fonksiyon ve integer türünde Deger1, Deger2, Deger3 isimli üç farklı değişken bulundurmaktadır. TASIT sınıfına ait BenNeyim isimli fonksiyon kendisinin bir taşıt olduğunu belirten log yazdırmaktadır. MOTORLUTASIT ve MOTORSUZTASIT sınıfları ise TASIT ana sınıfından türemekte ve Deger4 isimli integer türünden bir değişken bulundurmaktadır. Java dilinde türetme işlemleri extends anahtar sözcüğü ile yapılmaktadır. Deger4 ise ana sınıfta bulunmayan ve türeyen sınıflar(Derived class) ile birlikte gelen bir değişkendir. Peki ya ana sınıftaki Deger1, Deger2, Deger3 isimli değişkenlere ne oldu? Acaba yeni türeyen MOTORLUTASIT ve MOTORSUZTASIT sınıfları içerisinden bu değişkenlere erişip kontrol edebilir miyim ki? Bu sorularımıza ve merakımıza biraz daha gem vuruyor ve şimdilik aklımızın bir köşesine yazarak az sonra öğrenmek için bir kenera bırakıyoruz. Dikkat edilirse yeni türettiğimiz Inheritance UML sınıflar ile birlikte güzel bir ayrıntı gözümüze çarpar oldu. Artık " Türeyen her sınıf, ana sınıfı içerir" diyebiliriz kolay bir şekilde. Yani bir bakıma her MOTORLUTASIT ve MOTORSUZTASIT aslında birer TASIT'tır demek oluyor bu. İşte aralarında bu şekilde ilişki kurulabilen her ortamda kalıtımdan söz etmek mümkündür. Bu bahsettiğimiz 'IS A' ilişkisi olarak bilinmektedir. ("MOTORLUTASIT IS A TASIT" == MOTORLUTASIT bir TASIT'tır.) Yine bu türemiş sınıflara ait BenNeyim fonksiyonu da sınıfın ne olduğunu yazdırmaktadır. TAKSI ve OTOBUS, MOTORLUTASIT sınıfından türeyen sınıflardır. Fakat bu sınıfların kendisine özgü başka değişkenleri oluşturulmamıştır. Oluşturulma zorunluluğu da yoktur zaten. Ana sınıf içerisinde soyut(Abstract) olarak belirtilmedikçe override edilmesine gerek yoktur. Fakat ana sınıf içerisinde soyut olarak tanımlanmış bir öğenin alt sınıf içerisinde mutlaka override edilme zorunluluğu bulunmaktadır. Yazının ilerleyen bölümlerinde bu konuları daha detaylı inceleyeceğiz. Yalnızca MOTORLUTASIT sınıfına da kalıtım yolu ile geçen BenNeyim fonksiyonu iptal edilmiş(Override) ve kendisine özgü bir içerik oluşturulmuştur. Aynı şeyleri OTOBUS sınıfı için de söylemek mümkündür. BISIKLET sınıfı ise MOTORSUZTASIT sınıfından türemektedir ve tıpkı TAKSI ve OTOBUS gibi kendisine özgü yeni değişkenleri bulunmamaktadır. TAKSI, OTOBUS ve BISIKLET sınıflarının üçüde kalıtım ile kendilerine geçen BenNeyim fonksiyonu içerisine kendisinin ne olduğunu yazdıran yeni kod blokları eklemişlerdir. Yukarıda sorduğumuz sorunun bi benzeri de burda söz konusudur. MOTORLUTASIT ve MOTORSUZTASIT türemiş sınıfları içerisinde yeni oluşturulan Deger4 isimli değişkeni acaba TAKSI, OTOBUS ve BISIKLET sınıfları içerisinde kullanabilir miyim? En alt sınıf olan TASIT sınıfı içerisinde bu değişkenin olamamasına rağmen. İşte şimdi yavaş yavaş bu UML diagramına göre hazırlanmış ve bazı eklentiler yapılmış aşağıdaki kod bloğuna bakma ve sorularımızın cevabını alma vakti geldi. Fazlası...

JAVA - Access specifiers(Erişim belirleyicileri) nedir?

by Cem Kefeli 20. Mayıs 2010 07:16

JavaÇoğu zaman, hayatın her alanında bazı kısıtlamalar ile karşılaşıyoruz. Eğer bir şeylere sahiplik varsa onun saklanması, korunması da çok doğal bir istektir. Herkes, her zaman herşeyini birileri ile paylaşmak istemeyebilir. Daha da ötesi paylaşmasının çok da uygun olmayabileceğini düşünebilir. İzinsiz kullanımın, yetkisiz kullanımın önüne geçilmesi için de böyle bir yapı şarttır aslında. Programlama dillerindeki access specifiers(erişim belirleyicileri) kavramı da tamamen bu doğal dürtünün sonucunda ortaya çıkmıştır. Ben bir sınıf yazıp bunu bir pakatin içerisinde başkaları ile paylaşabilirim. Başkalarının da yazdığım kod parçacıklarından faydalanamasını sağlayabilirim. Fakat sınıf içerisinde yer alan bazı değişkenlerin kimse tarafından değiştirilememesini, bazı yordamların override edilememesini isteyebilirim. Kodun sahibi olarak bunları isteyebilmek benim en doğal hakkımdır aslında. Şöyle toparlayabiliriz bu kısmı; erişim belirleyicileri, programcı tarafından oluşturulan her bir yazılım öğesinin paylaşım sınırlarını belirlemek için kullanılmaktadır. Şimdi bu konuyu biraz daha açmanın zamanı geldi...

Java Access Specifiers - Erişim Belirleyicileri Öncelikle şunu söyleyeyim, yandaki şekil gözünüzü korkutmasın. İş hiç de şekilde görüldüğü gibi karışık ve öğrenilmesi güç bir sey değil. Aslında bu şekli gördükten sonra üzerinde konuşmaya da çok fazla gerek yok. Çünkü bu şekil ne var ne yok gayet güzel bir şekilde açıklıyor olayı. Yine arada ekleyeceğimiz kısa notlar olacaktır. Bizim bu belirteçlerden özellikle üzerinde duracağımız public, friendly, private, protected erişim belirleyicileridir.

İlk önce friendly erişim belirleyicisi ile başlamak istiyorum. Friendly erişim belirleyicisi java dili için standart erişim belirleyicisidir. Yani eğer herhangi bir erişim belirteci yoksa friendly olarak kabul edilir. Bu erişim belirleyicisi metodlara, sınıflara ve alanlara uygulanabilmektedir. Özelliği ise aynı paket içerisindeki tüm sınıflardan bu üyelere erişilebilirken, paket dışı üyelerden bu üyelere erişilememektedir. Burada enteresan olan ise bu erişim belirleyicisinin kullanılmasının istenmemesidir. Yani bir metodun, sınıfın ya da alanın başına friendly anahtar sözcüğünün yazılması istenmemektedir. Yazarsanız hata ile karşılaşabilirsiniz. Eğer bir üyeyi friendly olarak tanımalamak isterseniz yapmanız gereken o alanı boş bırakmaktır.

Public erişim belirleyicsi tüm üyeler tarafından herhangi bir sınırlama olmadan erişilebilmektedir. Hem sınıflara, hem metodlara, hem de alanlara uygulanabilmektedir bu erişim belirleyicisi. Public erişim belirleyicisine sahip bir üyeye hem paket içinden hem paket dışından, hem tanımlandığı sınıftan hem tanımlandığı sınıf dışından, kullanıldığı sınıftan türetilen tüm sınıflardan erişilebilmektedir.Fazlası...

JAVA - Interfaces(Arayüzler)

by Cem Kefeli 18. Ekim 2009 10:52

JavaJava'da kalıtımın nasıl gerçekleştirildiğini "Inheritance(Kalıtım) nedir?" başlıklı yazım içerisinde görmüştük. Kalıtım, OOP(Object Oriented Programming) bir dilde olmazsa olmazlardandır ki, uygulama geliştiricilere çok büyük güzellikler sunar. Tüm canlılarda olduğu bigi nesneler arasında da kalıtım ilişkisi kurulur ve yeni yeni türler tanımlanmasını mümkün kılar. Bir nesne tanımlarsınız, sonra bu nesneden başka bir nesne daha türetebilirsiniz. Fakat ya iki ya da daha çok nesnenin bir araya gelip bir nesne oluşturmasını isterseniz ne olacaktır? İşte burada durum karışıktır! Çünkü java çoklu kalıtmı desteklemez. Bir nesneyi yalnızca bir tane nesneden türetebilirsiniz. Bu aşamada imdadımıza Interfaces(Arayüzler) yetişir ve her ne kadar tam anlamıyla çoklu kalıtım olmasa da buna benzer bir davranışı bizlere sunar.

  • Arayüzler içerisinde yalnızca Abstract(Soyut) metodlar ve sabitler(constants) bulundurabilirler, gövdeli metodlar barındıramazlar. Soyut metodları ve sınıfları incelerken de soyut sınıfların bir birleştirici rol oynadıklarını, soyut sınıflardan türeyen sınıflara adete bir kılavuz gibi yol gösterdiğinden bahsetmiştik. Fakat soyut sınıflar gövdeli metodlar yani iş yapabilen metodlar da barındırabiliyorlardı.
  • Ayrıca bir sınıfın birden fazla soyut sınıftan türemesi de söz konusu değildi.
  • Hem soyut sınıflarda hem de arayüzlerde ortak olan bir nokta ise, soyut sınıflarda abstract olarak tanımlanan ve arayüzlerde tanımlanan her metodun bu soyut sınıf ve arayüzlerden türeyen tüm sınıflarca override edilmesi gerekliliğidir. Bu arada şunu söylemek gerekir ki arayüzler içerisindeki metod tanımlamalarında soyut sınıflarda kullandığımız gibi abstract anahtar sözcüğünü kullanamıyoruz. Nedeni ise arayüzlerin içerisindeki tüm metodların zaten abstract olarak değerlendirilmesidir. Dilin mimarisini oluşturanlar ayrıca bir daha abstract tanımlama yapılmasını gerekli görmemişler. Eğer yazarsanız hata mesajı ile karşılaşırsınız.
  • Bir diğer nokta ise arayüz içerisinde yapılan tüm metod tanımlamaları için bir erişim belirleyicisinin kullanılamayacağıdır. Varsayılan erişim belirteci olarak public seçilmiştir ve sizin bunu değiştirme şansınız da yoktur. Eğer bir metodun erişim belirleyicisini değiştirip örneğin private gibi bir erişim belirteci verebilseydiniz türeyen sınıflarda bu metodları override edebilmek imkansız olacaktır. Bu da arayüzler içerisindeki tüm metod tanımlamaları türeyen sınıflarda override edilmelidir ilkesi ile çelişecektir. Tabi ki metodların dönüş bildirim değerlerinin olmayacağı anlamına gelmemektedir ve bu ikisi birbirinden ayrı şeylerdir.Arayüzler içerisinde metodlar haricinde global alanlar da tanımlayabildiğimizi söylemiştik. Erişim belirleyicisi olarak bu alanlarlar da yine public olarak değerlendirmektedir. Bunu da sizin değiştirme şansınız yoktur. Ayrıca alanlara static ve final erişim belirteci de eklenmiştir, metodlardan farklı olarak. Tabiki bunlar arayüzler içerisinde birebir olrak yazan şeyler değildir. Yazılmasa dahi varsayılan olarak kabul görmektedirler.
  • Soyut sınıflardan başka soyut sınıflar türetebiliyorduk. Bu böyle arda arda devam edip gitmekteydi. Yine hatırlarsanız türeyen soyut sınıflarda, türedikleri soyut sınıf içerisinde yer alan soyut metodları override etme gibi bir zorunluluk da yoktu. Aynısı arayüzler için de geçerlidir. Arayüzler de başka arayüzlerden türeyebilmektedir ve bu özellik de arayüzler arasında da kalıtım ilişkisinin kurulabilmesini sağlamaktadır.

Bu birkaç önemli noktanın üzerinde durduktan sonra şimdi biraz daha uygulamaya dönük birşeyler yapabiliriz artık. Uygulama demişken Java'da arayüzler interface anahtar sözcüğü ile tanımlanmakta ve implements anahtar sözcüğü ile de uygulanmaktadır. Aşağıdaki örnekte yukarıda bahsettiğimiz bu birkaç özellik ile ilgili bir uygulama vermekteyim.Fazlası...

Hakkımda...

Cem KEFELİ

Electronics and
Telecommunication Eng.
devamı...


Son yapılan yorumlar...

Comment RSS

Yasal bir uyarı...

Disclaimer"Bu web sitesinde görmüş olduğunuz bilgilerin, dokümanların ve diğer materyallerin kullanılmasından doğabilecek hiç bir sorumluluktan site sahibi sorumlu tutulamaz. Web sitesi içerisinde yer alan yazılar, yorumlar, resimler ve diğer tüm içerikler yalnızca sahibinin görüşünü yansıtmakta olup içeriğin sahibi kişilerin çalıştığı kurumları bağlayıcı hiç bir nitelik taşımamaktadır. Yapılan tüm alıntılar mutlaka kaynak gösterilerek verilmeye çalışılmaktadır. Web sitesi içerisinde bulunan ilgili materyaller, ilgili yasal kurumlar tarafından uygun görülmemesi durumda kaldırılacaktır."
General