1~

Minter Coder's Blog

Ders 35 - Kalıtım/Inheritance 2

2021-04-08

Arkadaşlar merhabalar Inheritance konusuna devam ediyoruz.

2-Inheritance ile Constructor Tanımlama: Inheritance de arkadaşlar eğer ki super classımız parametre değerine sahip bir constructora sahip ise subclassların hepsi super() komutunu kullanarak bir constructor tanımlamak zorundadır.Örnek ;

public class Animal{
    private int age;
    public Animal(int age){
        super();
        this.age = age;
    }
}
class Dog extends Animal{
    public Dog(int age) {
        super(age);
    }
}

Yukarıdaki olay kısaca açıklanırsa Animal içerisinde parametreli bir constructor tanımladık ve bu içerisine age int türünde bir değer alıyor constructor içerisinde ise super(); ile Object classını çağırdık.this.age = age ile de parametre değerini instance variableye atadık.

Dog subclassımzıda ise constructor tanımladık bu da içerisine age adlı bir değişken aldı ve super(age) ile yukarıdaki Animal classının constructoruna gittik age değerini instance variableye atadık.

Not : super() komutu constructorun ilk ifadesi olmalıdır.Ikinci ifadeye bırakırsak hata alırız şöyle ki ;

class Cat extends Animal{
    private String name;
    public Cat(int age,String name) {
        this.name = name;
        super(age);
    }
}

Compiler bize şunu söyler :  "Call to 'super()' must be first statement in constructor body"

Not/2 : Arkadaşlar önceki inheritance dersinde şunu söylemiştim , eğer ki siz bir constructor oluşturmazsanız no-arg constructor yani boş bir constructor sizin yerinize compiler ekleyecek. Aşağıdaki üç olay eşittir ve constructor ilk ikisini , üçüncüsüne çevirecek.

1.

class Human{

}

2.

class Human{
    public Human(){
}

}

3.

class Human{
    public Human(){
        super();
    }
}

3-Constructor kurallarını gözden geçirelim ve çağrılma sırasına bakalım :

Önemli bir kısıma geldik.4 tane basit kural var constructorlarla ilgili bunlara bakalım ezberlemeye gerek yok . Bilmeniz gerek , zaten java progralamayı ezberleyemezsiniz arkadaşlar , önceki yazdıklarımızı okuduysanız bir nevi özet gibi gelecek.

  • Her constructorun ilk ifadesinde this() kullanımı aynı classın diğer constructoruna çağırır , super() ise parent classın constructorunu çağırır.
  • super() ve this() constructorun ilk satırında yer almalıdır onun dışında kullanılamaz compiler hata verir.
  • Eğer ki super() bir constructorda yoksa java no-arg super() olarak constructorun ilk ifadesine ekleyecektir.Yukarıdaki Human class örneğinde göreceğiniz gibi.
  • Eğer ki parent class boş bir constructora değil de parametreli bir constructora sahip ise subclass(child class) da constructor tanımlamasa ise compiler hata fırlatır.En üstteki örneğe bakın Dog classı constructor tanımlamak zorunda , yoksa hata alırız.

Şimdi constructorların çağrılma sırasına bakalım;

javada parent classımızın constructoru her zaman child classın constructorun öncesinde çalıştırılır.

public class Animal{
    Animal(){
        System.out.println("Animal constructoru calisti");
    }
}
class Dog extends Animal{
    Dog(){
        System.out.println("Dog constructoru calisti");
    }
}
class MainClass {
    public static void main(String[] args) {
        Dog d = new Dog();
    }
}

Yukarıdaki örnek hepsini özetliyor.

Animal classımız var ve biz bi constructor oluşturduk içerisinde dışarı çıktı vermesi için yazı yazdık , Dog classının constructoru da öyle ve Dog classının Animal classını extends ettiğine dikkat edin , çünkü her Köpek bir Hayvandır.

MainClassımızda bir d referanslı yeni bir Dog nesnesi oluşturduk . Ve programı çalıştırdığımızda çıktı olarak şunu alırız;

Animal constructoru calisti
Dog constructoru calisti

Çağrılma sırasında kısaca özet geçecek olursak ; Parent class constructoru child class constructorundan önce çalıştırılır.

Inheritanceyi diğer bölümde bitiriyoruz kendinize iyi bakın.