Sözlükte soyutlama anlamına gelen abstraction, OOP (Object Oriented Programming) yani Nesne Yönelimli Programlama’nın en önemli konuları arasında yer almaktadır. Bu yazıda, Java’da Abstract Class ve Abstract Metod’lar hakkında konuşacak, bunların nasıl ve ne için kullanıldığı hakkında bilgiler vermeye çalışacağız.
Abstract Metod Nedir?
Abstraction, bir metodu yalnızca karakteristik düzeydeki temel özellikleri ile oluşturmayı mümkün kılan bir konsepttir. Bu tür metodlar abstract metod olarak isimlendirilir. Abstract metotlar yalnızca ne yapıldığı ile ilgilenir, nasıl yapıldığını ise bu metodu override ederek kullanacak olan alt sınıf belirler.
Örnek vermek gerekirse tüm arabaların bir motoru, bir fren sistemi, bir çekiş gücü vardır. Fakat bu özellikler her arabada farklı şekil ve mahiyetlerde kendini göstermektedir. Toyota’nın motoru, fren sistemi, çekiş gücü farklı çalışmakta, Mercedes’inki farklı çalışmaktadır. İşte Abstract Metod oluşturduğunuzda yalnızca bu temel özelliklerin ‘Ne’ olduğuna yoğunlaşırsınız. ‘Nasıl’ sorusu ise bu arabaların özelinde verilmesi gereken bir cevaptır.
Abstract metodlarla ilgili bilinmesi gereken bazı özellikler şunlardır;
- Bir sınıfın içerisinde abstract metod oluşturmak için, o sınıfın abstract sınıf olması şarttır.
- Abstract bir metodun access modifier’ı public veya default olarak belirlenebilir.
- Abstract metodlar, metod signature’dan ibarettir.
- Abstract metodun bir body’si olmaz. Yukarıda da ifade ettiğimiz üzere işin ne olduğuna yoğunlaşır, nasıl yapıldığı ile ilgilenmez.
- Abstract metodlar alt sınıflar tarafından override edilecekleri için static veya final olamazlar.
Abstract Class Nedir?
İçerisinde bir veya birden fazla abstract metod barındıran her sınıf Abstract Class olmak durumundadır. Bu tür sınıflar diğer class’lardan farklı bir takım özelliklere sahiptir. Bu özellik ve farklılıkları şu şekilde sıralamak mümkündür;
- Diğer sınıfların aksine abstract sınıflardan nesne oluşturmak mümkün değildir.
- Abstract class’lar diğer sınıflarda olduğu gibi bir constructor’a sahiptir. Ancak bu constructor, alt sınıflara istenen özellikleri gönderebilmek amacıyla kullanılmaktadır.
- Abstract sınıfların içerisinde abstract olmayan metotlar oluşturulabilir.
- Abstract bir class’a, sınırsız sayıda class extend edilebilir. Yani abstract sınıf, sınırsız sayıda sınıfın parent class’ı olabilir.
- Fakat her bir abstract class, yalnızca bir class’a extend edilebilir. Birden fazla parent’ı olamaz, bir diğer deyimle, bbstract class’lar Multiple Inheritance’ı desteklemez
- Alt class’lar extend edildikleri abstract class’taki tüm abstract metodları override etmek zorunadırlar. Aksi halde kendileri de bir abstract class olmak durumundadırlar.
- Bir abstract class içerisinde, abstract metod olmaması şartıyla final veya static kelimesi ile veri oluşturmak mümkündür.
- Abstract metod kullanmaksızın bir sınıfı abstract olarak belirlemek mümkündür.
Abstraction Ne İçin Kullanılır?
Bazen tüm alt sınıflar tarafından kullanılmasını istediğimiz bazı özellikler belirlemek isteriz. Fakat bu özelliklerin niteliği her sınıfta farklı olabileceği için bunları body’siz yani işlevsiz bir şekilde deklare etme ihtiyacımız olur. Bu tür durumlarda abstract class’lar ve buna bağlı olarak abstract metodlar oluşturabiliriz. Böylelikle tüm alt sınıflar, body’siz olarak oluşturduğumuz bu metodları override etmek zorunda kalacak ve bunları kendilerine göre uyarlamak zorunda kalacaklardır. Aşağıda verdiğimiz örnekle birlikte konu daha iyi anlaşılacaktır.
Abstract Class ve Abstract Metod Nasıl Oluşturulur?
Yukarıda da ifade edildiği üzere, abstract bir metod içeren her sınıf abstract olmak zorundadır. Bir sınıf abstract class yapmak için, class kelimesinden önce abstract kelimesi yazılır.
public abstract class Arabalar {}
Abstract bir metod oluşturmak için ise, return type’dan önce abstract kelimesi yazılmalıdır. Abstract metodlar, normal metodlarda olduğu gibi farklı access modifier’lara sahip olabilirler.
abstract void benzinTuketimi();
Abstract’ları daha iyi bir şekilde anlamak için, abstract bir araba class’ı oluşturalım ve içine her arabada olması gereken fonksiyonları, abstract metod olarak ekleyelim. Arıca diğer alt sınıflar için zorunlu kılmak istediğimiz daha farklı fonksiyonlar da varsa, bunları abstract olmayacak şekilde ekleyelim. Ve daha sonra bu metotları alt class’larda override ederek kullanalım.
Abstract Class’ımız ve içerisinde bulunan abstract ve non-abstract metolar
public abstract class Arabalar { //abstract class
abstract void benzinTuketimMiktari(); //abstract metod
abstract void hizi(); //abstract metod
void abs(){ //abstract olmayan metod
System.out.println("Arabanızda ABS özelliği mevcut");
}
}
Abstract class’a extends ettiğimiz Toyota ve Mercedes classlarımız.
public class Mercedes extends Arabalar{
@Override
void benzinTuketimMiktari() {
System.out.println("Mercedes 100KM'de 5 Litre Benzin Tuketir");
}
@Override
void hizi() {
System.out.println("Mercedes Saatte 200KM ile Gider");
}
}
public class Toyota extends Arabalar{
@Override
void benzinTuketimMiktari() {
System.out.println("Toyota 100KM'de 4 Litre Benzin Tuketir");
}
@Override
void hizi() {
System.out.println("Toyota Saatte 180KM ile Gider");
}
}
Main metod içerisinde Toyota class’ından bir obje oluşturalım ve Abstract class’ımızdan override edilerek ve edilmeyerek miras alınan tüm metotlara erişelim.
public class Runner {
public static void main(String[] args) {
Toyota tyt = new Toyota();
tyt.benzinTuketimMiktari();
tyt.hizi();
tyt.abs();
}
}
Program Çıktısı:
Arabanızda ABS özelliği mevcut Toyota 100KM’de 4 Litre Benzin Tuketir Toyota Saatte 180KM ile Gider |