Arkadaşlar merhabalar , bugün artık yeni konu olan abstract classlara girecez.
Abstract class abstract keywordü ile işaretlemiş ve instantiated olamayacak sınıflardır.Yani siz bu sınıfın nesnesini oluşturamazsınız,başlatamazsınız.Abstract methodlarda vardır , bu methodlar da abstract keywordü ile işaretlenirler ve abstract sınıfın içerisinde kullanılabilirler ve kesinlikle instantiated olamazlar.Bunları başlatamazsınız , hani normal methodlarda süslü parantezler vardı bunu açıp içerisine bir şeyler yazabiliyoduk , fakat bunları açamıyorsunuz.Aşağııda hemen örneğimiz var;
public abstract class Animal{ protected int age; public void eat(){ System.out.println("While animal was eating , other animal ate it."); } public abstract String getType(); } class Hippo extends Animal{ @Override public String getType() { return "Hippo"; } }
Yukarıdaki olayı kısaca açıklayalım , abstract classımız Animal ve biz bunun içerisinde age adlı instance variablemizi yazdık ve eat() adlı methodumuz da bulunuyor , diğer methodumuz da abstract method getType() bu methodu farkedeceğiniz gibi eat() methodu gibi başlatamıyoruz , ancak ve ancak bu classı farklı bir class extends ederse biz bu methodu instantiated ederiz.Hippo classını görüyorsunuz , bu class Animal classını extends ediyo ve zorunlu olarak getType() methodunu override ediyor.Çünkü abstract classının içerisinde bir method var ve bu methodun extends edildiği sınıflarda instantiated edilmesi gerekiyo , ki , bu zorunludur.Onun dışında hata ile karşılaşırız.
! Bir abstract sınıfını final olarak işaretleyemzsiniz , aynı şekilde abstract methoduda final olarak işaretleyemesiniz, düşünün zaten getType adlı method zorunlu olarak override edilmesi gerekiyo , yok siz final olarak işaretleseniz methodun override edilmemesi gerekiyo fakat abstract methodlar iptal edilmek zorunda , ortada saçma bir durum oluşuyo , abstract method override edilmesi gerekirken final işaretlenecek method override edilmemeli , bu yüzden final olarak işaretlenemez.
"A final
class can't be extended, an abstract
class needs to be extended in order to be instantiated"
Abstract sınıfı ve methodu tanımlamak için kurallar var hemen şöyle bakalım
1)Abstract sınıflar direkt olarak başlatılamaz.
2)Abstract sınıflar private yada final olarak işaretlenemez
3)Bir abstract sınıf başka bir abstract classı inherit ederse , bu sınıf extends ettiği classın bütün abstract methodlarını da kendine dahil eder.Örneğin
public abstract class Animal{ public abstract String getType(); } abstract class BigAnimal extends Animal{ public abstract String getWeight(); } class Hippo extends BigAnimal{ @Override public String getType() { return "Hippo"; }<span style="color:#bbb529">@Override
public String getWeight() { return null; } }
Yukarıda görüldüğü gibi BigAnimal abstract classı Animal classını extends eder ve içerisinde getType methodunu da alır , eğer ki Hippo classı BigAnimal classını extends ederse bu sefer 2 abstract methodu override etmek zorundadır.
4)Abstract methodlar sadece abstract classların içerisinde tanımlanabilir;
5)Abstract methodlar private yada final olarak tanımlanamazlar.;
6)Abstract methodlar method gövdesi(method body) sağlamamalılar.Yani method gövdesi olmamalı eğer ki olursa hata ile karşılaşırız.