Java Programlama Dili'nde super() kullanımı

Bu yazımda Java'da super() anahtar kelimesi ne işe yarar ondan bahsedeceğim .

Java Programlama Dili'nde super() kullanımı

Merhabalar , Java bildiğiniz veya bilmediğiniz üzere nesneler üzerine kurulmuştur . Yani Java'da her şey bir nesnedir desek yanlış söylemiş olmayız . Bu nedenle Java'da OOP çok önemli bir yere sahip .

Ben de bu yazımda sizlere Java'da OOP mantığında sık kullandığımız bir anahtar sözcükten bahsetmek istiyorum . Bu anahtar sözcük super anahtar sözcüğü .

Gelin beraber bakalım super sözcüğü ne işe yarıyormuş :

Super nedir ?

Super anahtar sözcüğü bir üst sınıftan miras alan bir sınıfın üst sınıfın metotlarını , özelliklerini alt sınıftan çağırmamıza ve kullanmamıza olanak sağlar .

Super nasıl kullanılır ?

Super anahtar sözcüğü büyük harf ile başlamaz tamamen küçük harfler ile oluşturulur .
Yani çağrılışı şöyledir :

 

super


1.Super metodu ile üst sınıfın kurucu metodunu çağırma 

Super anahtar sözcüğünü üst sınıfın yapıcı metodunu çağırmak istediğimizde kullanırız . Bunun için kendi yapıcı metodumuz içerisinde super() olarak çağırıız .

Not: Biz çağırmasak da çocuk sınıfların kurucu metodu içerisinde otomatik olarak bir super() metot çağrısı yapılır . O nedenle üst sınıfın kurucu metotu eğer parametreli ise bizim çocuk sınıfın kurucu metotu içerisinde de bir parametreli super metot çağrısı yapmamız gerekmektedir .

 Örnek : 

İki adet sınıfımız olsun bunlar oyuncu ve esporOyuncusu sınıfları , esporOyuncusu sınıfı oyuncu sınıfından miras alsın .

Oyuncu sınıfı :

public class oyuncu {

     private int yas = 20;
     public oyuncu (){
          System.out.println("Oyuncu sınıfı");
     }
}

esporOyuncusu sınıfı :

public class esporOyuncusu extends  oyuncu {
    public esporOyuncusu() {
        System.out.println("Espor oyuncu sınıfı");
    }
}

Evet gördüğünüz gibi sınıflar bu şekilde . Herhangi bir super() metot çağrısı yok . Ama gelin bir tane esporOyuncusu nesnesi oluşturalım  ve çıktıyı hep beraber görelim .

public static void main(String arr[]) {

        esporOyuncusu esporcu = new esporOyuncusu();
}
Çıktı : 

Oyuncu sınıfı
Espor oyuncu sınıfı

 

Gördüğünüz gibi herhangi bir üst sınıf kurucu metotu çağrısı yapmadan üst sınıfın kurucu metotu da çalıştı . Bunun nedeni Java'nın arka planda kendisi bunu zorunlu kılması . 

Eğer üst sınıfın kurucu metotu parametreli olsaydı , bizim de parametreli bir super() çağrısı yapmamız gerekecekti .

Örneğin  üst sınıfın kurucu metodunu parametre ister şekilde güncelersek :

 public oyuncu (String zorunluParametre){
          System.out.println("Oyuncu sınıfı");
     }

Evet String tipinde bir adet parametre aldık . Ve miras alan sınıfımıza döndüğümüzde şöyle bir hata alacağız :
There is no default constructor available in 'com.company.oyuncu'

Bu hatanın nedeni alt sınıftaki default olarak oluşturulan super metodunun işe yaramadığıdır . Bunun iki çözümü vardır :

  1. Alt sınıftaki super çağrısına üst sınıfta istenen parametreleri yolamak .
     public esporOyuncusu() {
            super("Parametre eklendi");
    
            System.out.println("Espor oyuncu sınıfı");
        }
    

     

  2. Üst sınıfta bir adet parametresiz kurucu metot oluşturmak .
      private int yas = 20;
         public oyuncu(){
             // Parametresiz kurucu metot 
         }
         public oyuncu (String zorunluParametre){
              System.out.println("Oyuncu sınıfı");
         }

     

2.Super metodu ile üst sınıfın metotlarını kullanma

Miras alınan sınıfın metotlarını kullanmak istediğimiz zamanda da super çağrısı yaparız . Genelde bu çağrıyı üst sınıfın bir metotunu override ettiğimizde kullanırız . Bu kullanım sayesinde metotu kendimize göre uyarlamış oluruz ve yukarıdaki aynı isimdeki metotun yaptığı işi tekrar yazmamak amacıyla metot içerisinde tekrar çağırabiliriz .

public class oyuncu {

     private int yas = 20;

     void kos(){
          System.out.println("Oyuncu koşuyor");
     }

}
class esporOyuncusu extends  oyuncu {
     void enerjiAl(){

     }
     void kos(){
          enerjiAl();
          // Üst sınıftaki metot burada çağrılıyor .
          super.kos();
     }

}

Görüldüğü gibi esporOyuncusu sınıfında kos() diye bir metot kullandık ve bu metotu üst sınıftaki metotu override ederek kullandık ama üst sınıftaki metotun işlemlerini de ihtiyaç duyduğumuz için gelip o metotu super çağrısı ile çağırdık .

3.Super metodu ile üst sınıfın değişkenlerini kullanma

Miras alınan sınıftaki değişkenlere erişmek istediğimiz zaman da super metodunu kullanırız . Aşağıdaki örneği inceleyebilirsiniz :


public class oyuncu {
     int yas = 20;
}
class esporOyuncusu extends  oyuncu {
     int yas = 40;

     void yasYazdir(){
          // esporOyuncu sınıfındaki yas değerini yazdırır.
          System.out.println(yas);
          // oyuncu sınıfındaki yas değerini yazdırır .
          System.out.println(super.yas);
     }

}

class calistir{

    public static void main (String args[]){
          esporOyuncusu oyuncumuz = new esporOyuncusu();
          oyuncumuz.yasYazdir();
          // Çıktı : 40 20
     }
}