Java Programlama Dili'nde super() kullanımı
Bu yazımda Java'da super() anahtar kelimesi ne işe yarar ondan bahsedeceğim .
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 .
Ö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();
}
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 :
- 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ı"); }
- Ü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
}
}