Bu gün, method overloading terimi ile karıştırılan Method Overriding işlemlerinden bahsedeceğim. Method Overloading (Metotların Aşırı Yüklenmesi) makalesini okumadıysanız, lütfen öncelikli olarak bunu okuyunuz. Ayrıca makale içinde anlatılan birçok kısım Inheritance (Kalıtım) ile alakalı olduğu için; bu makaleyi de okumanızı tavsiye ederim.
Bir class, super class’dan extend (genişletme) edildiği zaman, super class’ın bir kısım üyesini veya bütün üyelerini alt sınıfa devretmiş olur. Sub class içerisinde, devralınan metoda ek özellikler katmak istendiğinde veya özellikleri tamamen değiştirmek istediğimizde o metodu ezmemiz, yani Override etmemmiz gerekmektedir. Bu işleme de Metod Overriding (Metot Ezme) denir. Bu sayede sub class’ın ihtiyacı olan değişiklikleri yapabiliriz.
Bu konuyu bir örnek ile daha anlaşılır bir hale getirelim.
class SuperClass {
void superClassMetodu() {
System.out.println("Super Class metodu çağrıldı");
}
}
class SubClass extends SuperClass {
void superClassMetodu() {
//SuperClass metodu ezildi
//İhtiyaca göre istediğiniz kodu burada yazabilirsiniz.
System.out.println("Sub Class metodu çağrıldı");
}
}
public class MethodOverriding {
public static void main(String[] args) {
SuperClass superclass = new SuperClass();
superclass.superClassMetodu(); //Output : Super Class metodu çağrıldı
SubClass subclass = new SubClass();
subclass.superClassMetodu(); //Output : Sub Class metodu çağrıldı
}
}
Override (ezme) işlemini geçekleştirirken bazı uyulması gereken kurallar bulunur. Şimdi onlardan bahsedelim.
Override (ezilecek) edilecek metodun adı, super class daki metot ile aynı isme sahip olmalıdır.
Override edilen metodun return (geri dönüş değer) tipi:
Override edilmiş metodun return tipi super class içindeki metot ile uyumlu olmalıdır. Super class içinde primitive return tipi kullanılıyorsa o zaman sub class’ın return tipi devralınan metodun return tipiyle aynı olmalıdır. Süper class içinde metodun return tipi türetilmiş bir tür ise, sub class’daki metod aynı türden veya alt türlerinden olabilir.
Aşağıdaki örnek daha açıklayıcı olacaktır.
class SuperClass {
void superClassIlkMetodu() {
System.out.println("Super Class'dan Çağırıldı");
}
double superClassIkinciMetot() {
return 0.0;
}
Object superClassUcuncuMetot() {
return new Object();
}
}
class SubClass extends SuperClass {
int superClassIlkMetodu() {
//Compile time (derleme zamanı) hatası, geri dönüş değeri int olmaz. super clas'da void
}
void superClassIkinciMetot() {
//Compile time (derleme zamanı) hatası, super class da primitive double kullanılmış. burada da double olmak zorunda
}
String superClassUcuncuMetot() {
//Compile time (derleme zamanı) hatası oluşmaz!!
//Return tipi super class'daki ile aynı değil.
// String; Object class'ının sub (alt) classıdır. Alt türlerden dönüş yapılabilir.
return new String();
}
}
Override edilen metodların görünürlüğü:
Override edilen metodun görünürlüğü devralınan metotla aynı veya daha yüksek olabilir. Ancak daha düşük bir görünürlülükte olmaz. Örneğin;
class SuperClass {
protected void superClassMetodu() {
System.out.println("Super class metodu çalıştırıldı");
}
}
class SubClass extends SuperClass {
private void superClassMetodu() {
//Compile Time (Derlem Zamanı) hatası, override edilen metot super class'daki metodun daha düşük seviyesinde görünürlüğe sahip olmaz.
//burada protected veya public olabilir ancak private olmaz.
}
}
Not: Görünürlük azalan sıraya göre; public –> protected –> default –> private diye devam eder.
Override edilen metodların parametreleri:
Override edilen metodun parametreleri super class’daki ile aynı olmaldır. Farklı olması hata oluşturmaz ancak o zaman metot override (ezme) yapılmış olmaz, bunun yerine overloaded (Method Overloading (Metotların Aşırı Yüklenmesi) ) yapılmış olur.
class SuperClass {
void superClassMetodu() {
System.out.println("Super Class Metodu Çalıştırıldı.");
}
}
class SubClass extends SuperClass {
//Aşağıdaki kullanım şekli ile bu class iki adet metoda sahip olmuş olur.
//birinci metodu parametresiz olarak super class'dakidir.
//ikincisi ise int parametresini alan aşırı yüklenmiş aşağıdaki class'dır.
void superClassMetodu(int i) {
System.out.println(i);
}
}
public class MethodOverloading {
public static void main(String[] args) {
SuperClass superclass = new SuperClass();
superclass.superClassMetodu(); //Output : Super Class Metodu Çalıştırıldı.
SubClass subclass = new SubClass();
subclass.superClassMetodu(); //Output : Super Class Metodu Çalıştırıldı.
subclass.superClassMetodu(10); // Output : 10
}
}
Umarım faydalı bir konu olmuştur. Aklınıza bir soru takıldıysa lütfen yorum yazarak benimle iletişime geçiniz.
Tek Yorum
[…] metodu implement ediliyorsa, bu metod public olmalıdır. Bu durum soyutlama kuralı değil, Method Overriding (Ezme) ile alakalıdır. Arayüz içinde tanımlı olan bütün metodlar, implement edildiği yerde […]