1~

Minter Coder's Blog

Ders 36 - Kalıtım/Inheritance 3

2021-04-08

Inheritanceye devam ediyoruz.

4-Inheritancede Class üyelerine erişme(method ve variables) :

Javada child classlar parent classın public yada protected erişim belirteçlerine sahip olan methodlar , primitive türlere erişebilir.Tek bir örnekle her şeyi gösterelim.

public class Animal {
    private int age;
    protected String name;
    public Animal(int age){
        this.age = age;
    }
    protected void yasiYaz(){
        System.out.println("Yas : "+age);
    }
    void isimYaz(){
        System.out.println("Isim yaz : "+name);
    }
}
class Dog extends Animal{
    Dog(int age){
        super(age);
        this.name = "Swan";
    }
}
class MainClass{
    public static void main(String[] args) {
        Dog d = new Dog(4);
        d.yasiYaz();
        d.isimYaz();
    }
}

Animal classımız var private access modifiere sahip age ve protected access modifiere name isminde değişkenler var.Constructorda ise parametreye gel değeri instance variablemiz olan ageye atıyoruz.Son olarak da yasiYaz() adlı bir protected methodumuz var bu da yaşı ekrana yazıyor.

Dog classımız var Animal classından derived edilmiş.Constructorumuzu zorunlu olarak tanımladık.super(age) ile gelen constructor değerini Animal classının constructoruna attık ve age adlı değişkenin değerini vermiş olduk daha sonra this.name ile gördüğünüz gibi bir değer atadık ,Swan, fakat göreceğiniz gibi Dog adlı classımız name adlı bir şeye sahip değil fakat buna erişmemizi sağlayan ve Dog adlı classın buna sahip olmasına yarayan özellik inheritance .Unutmayın isimYaz() adlı methodu da kullanabiliyoruz çünkü default access modifier , aynı pakette bulunduğu için kullanılabilir bunu da oraya ekstra bilgi olsun diye yazdım. Eğer ki farklı package'lerde olsaydılar isimYaz() kullanılamazdı.

MainClass classında d adlı bir referansımız var ve Dog nesnemizi oluşturduk burada yasiYaz() adlı methodu kullanabildik gördüğünüz gibi çünkü en üstte yazdığım gibi child class parent classın protected yada public class members(sınıf üyelerine = method+instance variables) erişebilir.Eğer ki biz private yapmış olsaydık d.yasiYaz() adlı methodu kullanmazdık.Eğer ki name adlı değişkeni de private access modifier yapsaydık bunu da kullanmazdık.

private void yasiYaz(){ System.out.println("Yas : "+age); }

private String name;

Yukarıdaki örneğin çıktısı ;

Yas : 4
Isim yaz : Swan

Not : this ve super keywordleri parent classdaki değişkenler yada methodlar için kullabılabilir , fakat sadece this keywordü yazıldığı classın , class membersleri için kullanılabilir.

Şimdi örneğimize bakalım.

class Dog extends Animal{
    private int surname;
    Dog(int age){
        super(age);
        super.name = "Swan";
        super.isimYaz();
    }
}

Dog classımızda önceki örnekte this.name = "Swan"; demiştik ve bununla içinde bulunduğumuz classın name değişkenine erişebildik fakat bu değişken Animal classında olduğu için(parent class) buna super keywördü ve this keywordü ile de erişilebilir.this ile de erişbilme belki kafanızı karıştırmış olabilir , arkadaşlar unutmayın Animal classını da extends ettik içindeki class membersler Dog sınıfına da include edildi.Eğer ki aşağıdaki durum olsaydı ;

class Dog extends Animal{
    private String surname;
    Dog(int age){
        super(age);
        super.surname = "Swan"; // !!
        super.isimYaz();
    }
}

burada surname değişkenine super keywordü ile erişemeyiz çünkü içinde bulunduğumuz class , yok eğer ki biz surname adlı değişkene erişmek istiyorsak this keywordünü burada kullanmalıyız.

this.surname = "Swan";

super ve super() arasındaki fark;

arkadaşlar super() ile parent classın constructoruna erişebiliyoduk yukarıda açıkladığımız gibi , super keywordü ile de parent classın , class memberslerine erişebiliyoduk.Unutmayın , super() komutu her zaman constructorda ilk satırda olmalıdır.

Dog(int age){
    super.name="JaguR";
    super(age);
}

Böyle bir şey hataya yol açar.Compiler şunu söyler ; Kardeşim super() constructoruda ilk ifadede olur beni deli etme adam akıllı düzelt onu.