Serkan Ayyıldız

Meraklı bir yazılım uzmanı...

Java Abstract Sınıf ve Metotlar

Java sever yazılım geliştiricilere yeniden selamlar :)

Uzun bir süredir iş yoğunluğum sebebiyle makale yazamadım ve kısmet bugüneymiş diyerek Java Abstract (özet) sınıfları öğrenelim istedim.
Aslında aynı konuyu C# programlama dili için anlatmıştım ama kurallar ve konu aynı olsa dahi Java'da da öğrenelim değil mi? :)

Abstract sınıf, özet sınıf anlamına gelmektedir ve içeriğinde hem normal sınıf üyelerini barındırabildiği gibi hem de interface (arayüz) üyelerini barındırabilen özel bir class tipidir.

Bu sınıfın en önemli özelliği hem sınıf hem de interface gibi kullanılabilmesinden öte "new" sözcüğüyle instance alabilinememesidir,yani abstract bir sınıfı doğrudan kullanamazsınız
ancak başka sınıflara kalıtım vermek amacıyla kaynak-temel sınıf gibi kullanabilirsiniz.

Şimdi NetBeans uygulamamızı açalım ve yeni bir Java uygulaması oluşturduktan sonra projemize "Canli" adında abstract bir sınıf ekleyelim:

java-abstract-class

Canlı isimli sınıfımız ile diğer sınıflara kalıtım vereceğiz ama öncelikle yukarıda bahsettiğim gibi instance (örnek kopya) alınamaz kuralını görelim:

abstract-instance

NetBeans IDE'miz abstract olarak işaretlenmiş bir sınıftan new sözcüğüyle instance alınamayacağını ve böyle bir kullanımın olamayacağını belirtmektedir.

Nesne yönelimli programlama (object orianted programming) konusu olan abstract sınıflar özellikle orta ve büyük çaplı projelerde kullanılmaktadır çünkü geliştirilen projelerin mantık (logic) katmanında hangi özelliğin nereden kalıtım (inheritance) alınacağı en başta belirlenir ve temel özellikler ya interface'lerde ya da abstract sınıflarda kodlanmaya başlanır.
Dolayısıyla küçük çaplı projelerde abstract sınıflar kullanılsa dahi fazla bir verim alınamadığı gibi zaman kaybına sebep olabilirler ancak yazılımcı adam nesne yönelimli programlamanın tüm nimetlerini bilmeli ve rahatlıkla faydalanabilmelidir :)

Abstract sınıf kalıtım vermek amacıyla kullanılır ve bu yüzden new sözcüğüyle birlikte kullanılamaz,hatta new sözcüğüne izin verilmemesinin bir başka nedeninin ise içeriğinde interface özelliklerinin varolabileceği için çalışma zamanında (runtime) hataya sebep olmaması için tasarlandığını düşünüyorum.

Neyse konumuza dönelim ve şimdi de "Kus" adında bir sınıf oluşturalım ve bu sınıfımız "Canli" sınıfımızdan kalıtım alsın isteyelim:

java-class-kalitim

Kalıtım alan sınıfların içeriği boş olmak zorunda değillerdir, örnek olarak sınıfımızın içerisine "Uc" metodu ekledik.

Canlı sınıfından doğrudan instance alamıyorduk ancak canlı sınıfından kalıtım alan kuş sınıfından instance
almaya çalıştığımızda NetBeans herhangi bir hata vermeyecektir:

java-abstract-metot

Buraya kadar abstract tipteki canlı sınıfımızın bildiğimiz kalıtım vermesi olayını daha önceki kalıtım verme konusunda öğrenmiştik,şimdi gelelim abstract bir sınıfın interface gibi davranabilmesi olayına...

Abstract sınıfların özellikle kullanılmasının sebebi olan interface gibi kullanılabilmeleri oldukça hoş bir konu olduğu için birçok yazılımcı interface kullanmak yerine doğrudan abstract sınıfları tercih etmektedirler,bu genelde proje yönetim stratejisiyle alakalı bir konu olduğu için yazılım mimarlarının insiyatiflerine kalmış.

Az önce oluşturduğumuz Canli sınıfının içerisine abstract tipte metotlar yazalım:

abstract-method

Eğer bir abstract sınıfı instance vermeyen ancak sadece kalıtım verecek şekilde kullanmak istiyorsak içeriğindeki
üyelere normal classlarda olduğu gibi o haliyle bırakırız ama eğer ki bir abstract sınıfı interface gibi kullanmak
istiyorsak üyelerinin başına "abstract" sözcüğünü tanımlamamız gerekmektedir.

Ayrıca Java Interface konusunda öğrendiğimiz gibi metotların yalnızca gövdelerini yazarız,bu sayede abstract sınıf
interface kurallarına uymuş olur.

Interface gibi davranan abstract Canli sınıfımızı şimdi de kendisinden kalıtım alacak olan "Kedi" sınıfına kaynak
sınıf olarak tanımlayalım:

java-extends

extends-inheritance

Az önceki kullanımdan farklı olarak interface üyelerimiz sınıfımıza otomatik olarak implemente (kod oluşturma) edildiler
ve bu yönleriyle interface'lerden farksız olduklarını gördük.
Elbette bu implementasyona yalnızca abstract olarak işaretlenmiş metotlarımız dahil edildiler, diğer abstract olmayan üyeler ise zaten baştan tam tanımlı oldukları için arkaplanda Kedi sınıfına aktarıldılar.

Oluşturduğumuz Kedi sınıfından new anahtar sözcüğüyle instance alalım:

java-class-instance

Bu sayede Canli sınıfından temel üyeleri doğrudan kullanmak yerine içeriğinin kullanıldığı bir sınıfa kalıtım vererek
nesne yönelimli programlama prensiplerine uygun hareket etmiş bulunuyoruz.

Abstract sınıflarıyla ilgili bu kadar güzellikten sonra gelelim tek olumsuz yanına; 

"Bir sınıf birden çok interface'den kalıtım alabilir ancak abstract olsun olmasın en çok bir sınıftan kalıtım alabilir."

kuralına göre biz yazılımcılara büyük bir kısıtlama getirmektedir.

Bunun dışında içeriğinde interface üyeleri olsun ya da olmasın her abstract sınıf yukarıdaki kuralla çelişmediği sürece
kalıtım alabilmekte özgürdür, tıpkı interface'ler gibi...

Java Abstract Class konusu ile ilgili şimdilik aklıma gelenler bunlar olduğu için makalemize burada son noktayı koyuyoruz,
bir sonraki makalemizde görüşünceye dek hoşçakalın esen kalın :)



Bir yorum bırak E-posta adresiniz yayınlanmayacaktır.

Menu