-- Java SE

Method Overriding

Alt sınıfın üst sınıfa ait metodu yeniden tanımlamasına Override işlemi denir. Override edilen metodun imzası( return tipi, parametre tipi ve sayısı) üst sınıftaki metodla aynıdır. Bu işlem Run Time Polymorphism’i sağlamak için yapılır. Yani override edilen metod referans tipine göre değil, başvurulan nesneye göre çağrılır.

Output :

Üst sınıfın metodu çağırıldı

Alt sınıfın metodu çağırıldı.

 

  • Çoklu override işlemi gerçekleştirilebilir.

Output :

Torun'un metodu.

 

  • final metodlar override edilemezler.

class Parent
{
    // override edilemez!
    final void show() {  }
}
 
class Child extends Parent
{
    // HATA!
    void show() {  }
}

Output :

13: error: show() in Child cannot override show() in Parent
    void show() {  }
         ^
  overridden method is final

 

  • Override edilmiş metoda daha düşük seviyeli acces modifier verilemez fakat tam tersi olabilir. Örneğin, üst sınıftaki protected metod alt sınıfta private metod olarak override edilemez.
class Parent
{
    
    protected void show() {  }
}
 
class Child extends Parent
{
    // HATA VERİR!
   // public veya protected olmalı!
    private void show() {  }
}
  • private metodlar inner class içerisinde dahi override edilemezler.

Output :

13: error: fun() has private access in Base
	obj.fun();
	   ^
1 error

Görüldüğü gibi “error: fun() has private access in Base” hatası veriyor. Ayrıca Compiler Base Class içerisindeki metodu çağırmayı denedi, Derived Class içerisindekini değil.

Bir inner sınıf, outer sınıfının private üyelerine erişim yapabilir, peki bu inner sınıfı extend edip, fun() metodunu oluşturursak ne olur?

Output :

Outer'ın private üyesine erişim : Outer private mesaj

Outer fun() metodu çağırıldı.

Çıktıdan da anlaşılacağı üzere override edilmedi çünkü private metodlar compile time süresince bağlıdırlar ve hangi metodun çağırılacağına nesnenin tipine göre değil reference variable’ın tipine göre karar verilir.

  • Static metodlar override edilebilir mi?

Alt sınıfta aynı imzaya sahip static metod tanımlanabilir ancak bu Run-Time-Polymorphism sağlamayacağından override edilebilir olarak düşünülmemelidir.

Eğer alt sınıf aynı imzaya sahip bir static metod tanımlarsa, bu metod üst sınıftaki static metodu gizler. Koddan daha iyi anlaşılır.

Output :

Base class icerisindeki static metod.
Subclass icerisindeki non-static metod.

1)Class(static) metodlar nesnenin tipine göre değil, reference tipine göre çağılırlar. Yani metod çağrılmaya compile time sırasında karar verilir.

2)Instance(non-static) metodlar reference tipine göre değil, nesnenin tipi göre çağılırlar. Yani metod çağırmaya run time sırasında karar verilir.

3)Instance metodlar, static metodları override edemezler, aynı şekilde static metodlar instance metodları saklayamazlar. Örneğin aşağıdaki programda 2 compile error oluşur.

Output :

20: error: display() in Derived cannot override display() in Base
	public void display() {
	            ^
  overridden method is static
25: error: print() in Derived cannot override print() in Base
	public static void print() {
	                   ^
  overriding method is static
2 errors

 

  • Override edilen metod içerisinde super keywordu ile üst sınıfın metodu çağırılabilir.

Output :

Parent's show()
Child's show()

 

Yorum bırak

Yorum