"Enter"a basıp içeriğe geçin

Java’da super ve this anahtar kelimeleri

Kalıtım ile ilgili konulara devam edelim. İşte bu makalenin kosusu; “super” ve “this” anahtar kelimeleri.

super anahtar kelimesi, super class içindeki metotlara field’lara ve constructor’lara erişmek için kullanılır. super class‘ın ne olduğunu bilmiyorsanız, sizlere önceki makalelerimi okumanız konusunda tavsiyede bulunabilirim. Yazılan makaleler belirli bir sırada olduğu için (başlangıç –> ileri seviye), JAVA’ya yeni başlayan biriyseniz en başından itibaren okumanız, sizlere büyük fayda sağlar diye düşünüyorum. Konumuza geri dönüp, super anahtar kelimesinin kullanımı ile ilgili bir örneği inceleyelim.

class SuperClass {
    int i;    //Field
 
    SuperClass(int j) {
        System.out.println("Super Class Constructor'ı");
    }
 
    void superClassMetodu()     //metot
    {
        System.out.println("Super class metodu");
    }
}
 
class SubClass extends SuperClass {
    SubClass() {
        super(10);
        //super class constructor'ını çağırır
    }
 
    void subClassMetodu() {
        System.out.println(super.i);  //super class field'ına erişildi
        super.superClassMetodu();  // super class metodu çağırıldı
        System.out.println("Sub class metodu");
    }
}

Yukarıdaki kodda bulunan yorum satırlarında da görebileceğiniz gibi SubClass, subClassMetodu içerisinden super class’a ait field’a ve metoda erişilmiştir. Yine sub class constructor’ı içinde, super class constructor’ı çağırılmıştır. Özellikle belirtilmesi gereken bir şey var. “super()” şeklindeki bir kullanım, super class constructor’ı nı çağırmak için kullanılır ve super() satırı constructor dışında, başka hiç bir yerde kullanılamaz. Ayrıca Constructor konusunda anlatıldığı gibi, varsayılan olarak “super()” deyimi bütün constructor’ların ilk deyimidir.

Ne zaman super anahtar kelimesini kullanmalıyız?
Super class içersindeki bir metodu aynen kullanmak istiyorsanız ve bu metoda ek olarak bazı işlevler de yaptırmak istiyorsanız, super anahtar kelimesini kullanabilirsiniz. Yapmanız gereken şey ise çok basit. Öncelikle super anahtar kelimesini kullanarak metodu çağırın ve ardından ek işlevlerinizi ekleyin.  Ayrıntılı bilgiyi aşağıdaki örnekte ve yorum satırlarında bulabilirsiniz.

class SuperClass {
    void superClassMetodu() {
        //işler burada
    }
}
 
class SubClass extends SuperClass {
    void subClassMetodu() {
        super.superClassMetodu();  // super class metodu çağırılıyor.
 
        //buraya eklemek istediğiniz işlevleri ekleyebilirsiniz.
    }
 
    //bu işlemi super class metodunu override ederekte yapabilirsiniz
 
    void superClassMetodu() {
        //super class metodu ezildi.
 
        super.superClassMetodu();
 
        //buraya eklemek istediğiniz işlevleri ekleyebilirsiniz.
 
    }
}

this anahtar kelimesi:
“this”
 anahtar kelimesini kullanarak aynı sınıfa ait olan field’lara, metotlara ve constructor’lara erişebilirsiniz. this anahtar kelimesi kullanıldığı yerde, aynı class’ın geçerli bir örneğiymiş (yeni bir instance’mış) gibi davranır.

class HerhangiBirClass {
    int i;
 
    HerhangiBirClass() {
        System.out.println("İlk Constructor");
    }
 
    HerhangiBirClass(int j) {
        this();    //Bu ifade ilk constructor'ı çağırır.
        System.out.println("İkinci Constructor");
    }
 
    void metotBir() {
        System.out.println("metotBir");
    }
 
    void metotIki() {
        System.out.println(this.i);  //Aynı class içindeki i field'ına erişir.
        this.metotBir();      //Aynı class içindeki metodBir metodunu çağırır.
    }
}

“this()” ifadesi constructor’ı çağırır ve constructor dışında kuıllanılamaz. Eğer constructor içinde kullanılırsa ilk ifade olarak yer almalıdır.  Constructor  konusuna bakarak, constructor kullanım kurallarını öğrenebilirsiniz.

Önemli Notlar:

“super” ve “this” anahtar kelimelerini, erişmek istediğiniz üyeler static olsa bile “static metot” ve “SIB (Static Initialization Blog)” içinde kullanamazsınız. Aşağıdaki örneğin yorum satırlarını inceleyiniz.

class SuperClassOne {
    int i;      //Non-Static üye
 
    static void metotBir() {
        //static method
        System.out.println("super class içinden");
    }
}
 
class SubClassOne extends SuperClassOne {
    static {
        System.out.println(super.i);
        this.metotIki();
 
        //yukarıdaki idadede compile time hatası oluşur
        //this ve super anahtar kelimelerini SIB içerisinde kullanamazsınız.
    }
 
    static void metotIki() {
        super.metotBir();
        this.methodOne();
 
        //Compile time hatası oluşur
        //this ve super anahtar kelimelerini static metodlar içerisinde kullanamazsınız.
        //Erişilmek isteden üye statik olsa bile.
    }
}

“super()” ve “this()” ifadeleri mutlaka bir constructor içinde kullanılmalı ve kullanıldıkları yerdeki ilk ifade olmalıdırlar.

class SuperClassBir {
    void metotBir() {
        System.out.println("Super class içinden");
    }
}
 
class SubClassBir extends SuperClassBir {
    public SubClassBir() {
        System.out.println("constructor'lar");
        super();
        //compile time hatası alınır.
        //super() ifadesi, kullanıldığı yerin ilk ifadesi olmalı.
        //System.out.println("constructor'lar"); ile super(); satırları yer değiştirirse bir sorun kalmaz.
    }
 
    void metotIki() {
        super();
        this();
        //compile time hatası alınır
        //super() ve this() ifadeleri yanlızca constructor içinde kullanılabilir.
    }
}

Umarım faydalı bir makale olmuştur. Anlamadığınız veya aklınıza takılan bir konu varsa, benimle yorum yazarak iletişime geçebilirsiniz.

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir