super() metodu

Bir alt-sınıf ne zaman üst-sınıfına erişmek isterse super anahtar sözcüğünü kullanabilir. super ‘in kullanımı iki türlü olur. Birincisi, üst-sınıfa ait nesne yaratmak içindir. İkincisi, üst-sınıfın öğelerine erişmek içindir. Bundan sonraki örneklerde, bu işlerin nasıl yapıldığını göreceğiz.

a.       Üst-sınıfa ait nesne yaratma:

Bir alt-sınıf, super() metodunu kullanarak, üst sınıfının bir nesnesini yaratabilir ve onun değişkenlerine değer atayabilir. AltKutu sınıfında ust-kutuya ait anlık değişkenleri kullanarak nesne yarattık. Üst-sınıfın iç-değişkenleri private olmadığı sürece, bunu yapmak mümkündür. Ama, üst-sınıfın değişkenleri private damgalı olduğunda, alt-sınıftaki kodlar, onlara erişemeyecektir. Çoğunlukla, üst-sınıfın öğelerinin private olmasını isteriz. Böylece üst-sınıfın yapısını diğer sınıflardan saklarız. Buna encapsulation denir. Bu durumlarda, üst-sınıfın öğelerine erişmenin yolu super() metodunu kullanmaktır.

Bir alt-sınıf içinde üst-sınıfa ait bir nesne yaratmak için sözdizimi şöyledir:

        super(formal_parametreler_listesi);

Üst-sınıfta overload edilmiş constructor metotları varsa, alt-sınıftan super() metodu ile onların her birisi çağrılabilir.  Çağrıda, formal parametreler listesine, üst-sınıfa ait olarak yaratılacak nesneyi belirleyecek gerçek parametreler konur. Bu demektir ki, üst-sınıfta overload edilen constructor’lardan hangisi isteniyorsa, onun parametreleri yerine gerçek değerler konulur. Ancak, super() metodu alt-sınıftaki constructor içine ilk deyim olarak yazılmalıdır; çünkü constructor çağrılınca ilk işi nesneyi yaratmaktır. Nesne yaratılmadan, onunla ilgili hiçbir iş yapılamaz.

Aşağıdaki örnek, AltKutu sınıfında bir yapıcı (constructor metodu) tanımlamaktadır. Yapıcı içinde tanımlanan AltKutu constructoru, super() metodunu çağırmaktadır. super() metodu, üst-sınıfa ait bir nesne constructor yerine geçer. Üst-sınıfta overload edilmiş constructorlar tanımlı ise, hangisini çağıracağını, kullanılan parametreler belirler. Çünkü, java derleyicisi overload edilen fonksiyonları, parametreleri yardımıyla birbirinden ayırır.   

 

/* super() metodunun kullanılışı:

   alt-sınıf, super() metodunu kullanarak

   üst-sınıfın bir nesnesini yaratabilir ve

   onun değişkenlerine değer atayabilir.

*/

class AltKutu extends Kutu {

  double agr;  //kutu’nun ağırlığını tutacak değişken

 

  /* super() metodu ile en, boy ve yukseklik

     değerlerine atama yapıyor. */

  AltKutu(double e, double b, double y, double a) {

    super(e, b, y); // ust-sınıfa ait constructor’u çağrılıyor

    agr = a;

  }    

}

 

Dikkat edilirse, yukarıdaki AltKutu sınıfı içinde tanımlanan AltKutu() constructoru super(e,b,y)metodunu çağırmaktadır. Bu metot, üst-sınıftaki Kutu(e,b,y) constructor’unun yerine geçmektedir. Bunu daha iyi anlamak için, önce yazdığımız Kutu sınıfını anımsamak yetecektir. Tabii, uygulama programı bu satıra gelmeden önce e,b,y değerlerine gerçek parametre değerlerini atamış olacaktır. Dolayısıyla, constructor, gerçek parametrelerle çağrılıyor. Aksi halde nesneyi yaratamaz, derleme hatası oluşur.

class Kutu {

double en;

double boy;

double yukseklik;

 

Kutu(double e, double b, double y) {

en = e;

boy = b;

yukseklik = y;

}

 

AltKutu constructoru gerçek parametrelerle çağrılınca Kutu sınıfına ait bir nesne yaratılmış ve onun en, boy ve yükseklik değerleri nesneye girilmiş olacaktır. AltKutu alt-sınıfı üst-sınıfında olmayan agr (ağırlık) değişkenine sahiptir. Dolayısıyla AltKutu() constructoru nesneyi yaratırken ona da bir değer atamalıdır. Constructor içindeki son deyim olan agr = a; deyimi bu atamayı yapacaktır.

Örneğimizde, super() metodu 3 gerçek parametre ile çağrılmaktadır. Gerektiğinde bu sayı değişebilir. Üst-sınıfta constructor metodu overload edildiği için, aynı adlı farlı constructorları çağırmak mümkündür. Tabii, üst-sınıfta overload edilen bu metotların önceden tanımlanmış olması gerekir.

 

Liste 4:

Yukarıda söylenenleri topluca görebilmek için Kutu sınıfını, overload edilen constructorlarını içerecek biçimde yeniden yazalım.

 

           // Kutu ve AltKutu’nun tanımları.

class Kutu {

  private double en;

  private double boy;

  private double yukseklik;

 

 /* Parametreli constructor.

     Constructor metodunun parametresi kendi

     sınıfının tipindendir. */

  Kutu(Kutu ob) {

    Width  = ob.en;

    boy    = ob.boy;

    yukseklik  = ob.yukseklik;

  }

 

  /*

   * Parametreli constructor.

   * Constructor çağrılırken formal parametreler

     yerine gerçek parametreler girilir.

  */

  Kutu(double e, double b, double y) {

    en  = e;

    boy = b;

    yukseklik  = y;

  }

 

  /*

   * Parametresiz constructor.

   * Değişkenlere geçici -1 değeri atanmıştır.

   * Program koşarken gerçek değerleri alacaktır.

  */

  Kutu() {

    en  = -1;         // geçici değer

    boy = -1;         // geçici değer

    yukseklik  = -1;  // geçici değer

  }

 

  /*

   * Tek parametreli constructor.

   * Boyutlar eşit kılınarak, bir küp yaratılıyor.

  */

  Kutu(double uzunluk) {

    en = boy = yukseklik = uzunluk;

  }

 

  // Kutu’nun hacmini hesaplayan metodun tanımı

  double hacim() {

    return en * boy * yukseklik;

  }

}

 

 

Alıştırmalar:

1.        Bu sınıfı derleyiniz ve Kutu.class  bytekodunu ayrı bir dizine koyunuz. Derlemek için

 

javac Kutu.java

 

komutunu çalıştırınız.

Liste 5:

İkinci iş olarak, Kutu sınıfı için yaptıklarımızı  AltKutu alt-sınıfı için de yaparak onu yeniden yazalım. Alt-sınıfta overload edilen constructorlara dikkat ediniz.

 

  // AltKutu bir alt-sınıftır; Kutu adlı üst-sınıfın bütün

  // constructorlarını etkin kılar.

class AltKutu extends Kutu {

  double agr; // kutu’nun ağırlığı

 

/* Bu constructor, super() metodu ile üst-sınıfa ait

 * bir nesne yaratıyor. Yaratılan nesne’nin

 * adresi ob ile gösteriliyor (referans, pointer).

 * constructor’un parametresi kendi sınıfının tipindendir. 

*/

  AltKutu(AltKutu ob) {

    super(ob);

    agr = ob.agr;

  }

 

  /* Bu constructor çağrılınca bütün

   * değişkenlere değer atar

  */

  AltKutu(double e, double b, double y, double a) {

    super(e, b, y); // superclass constructor çağrımı

    agr = a;

  }   

          // default constructor

  AltKutu() {

    super();

    agr = -1;

  }

          // Bu constructor küp yaratır

  AltKutu(double uzunluk, double a) {

    super(uzunluk);

    agr = a;

  }

}

 

 

Alıştırmalar:

 

1.       Bu sınıfı derleyiniz ve AltKutu.class  bytekodunu Kutu.class bytekodunun bulunduğu dizine koyunuz.

2.       Aşağıdaki program parçası yukarıdaki  AltKutu sınıfından alınmıştır. Bu program parçasını çözümleyiniz (yani, içerdiği her sözcüğün ve deyimin anlamını açıklayınız).

 

AltKutu(AltKutu ob) {

  super(ob);

  agr = ob.agr;

}

  

3.     Aşağıdaki programı çözümleyiniz.

 

 

class ColorKutu extends Kutu {

  int color;                // Kutu’ın rengi

 

  ColorKutu(double e, double b, double y, int c) {

    en = e;

    boy = b;

    yukseklik = y;

    color = c;

  }   

}

 


Liste 6:

Son iş olarak, Kutu sınıfı ile AltKutu alt-sınıfı ile ilgili uygulama yapmak için aşağıdaki UygulamaPrg uygulama programını yazalım. Uygulama programları mutlaka main() metodunu içermelidir.

 

 

class UygulaKutu {

  public static void main(String args[]) {

    AltKutu kutu1 = new AltKutu(10, 20, 15, 34.3);

    AltKutu kutu2 = new AltKutu(2, 3, 4, 0.076);

    AltKutu kutu3 = new AltKutu();        // default

    AltKutu mycube = new AltKutu(3, 2);

    AltKutu myclone = new AltKutu(kutu1);

    double vol;

 

    vol = kutu1.hacim();

    System.out.println("kutu1 in hacmi = " + vol);

    System.out.println("kutu1 in hacmi = " + kutu1.agr);

    System.out.println();

 

    vol = kutu2.hacim();

    System.out.println("kutu2 nin hacmi = " + vol);

    System.out.println("kutu2 nin hacmi = " + kutu2.agr);

    System.out.println();

 

    vol = kutu3.hacim();

    System.out.println("kutu3 ‘ün hacmi = " + vol);

    System.out.println("kutu3 ‘ün hacmi = " + kutu3.agr);

    System.out.println();

 

    vol = myclone.hacim();

    System.out.println("myclone ‘ın hacmi = " + vol);

    System.out.println("myclone ‘ın hacmi = " + myclone.agr);

    System.out.println();

 

    vol = mycube.hacim();

    System.out.println("mycube ‘ün hacmi = " + vol);

    System.out.println("mycube ‘ün hacmi = " + mycube.agr);

    System.out.println();

  }

}

 

 

Alıştırmalar:

 

1.              Bu sınıfı derleyiniz, çıkan UygulaKutu.class bytekodunu AltKutu.class  bytekodu ile Kutu.class bytekodunun bulunduğu dizine koyunuz. Sonra java interpreter ile çalıştırınız:

 

                                               java UygulaKutu

 

 

2.              Çok basamaklı alt-sınıflar tanımlanmışsa, super() metodu daima en yakın üst-sınıfa ait nesne yaratır. Yaratılmak istenen nesnenin ait olduğu sınıf içinde super() metodu kullanılamaz. Bunu görmek için, yukarıdaki Kutu sınıfında super() metodunu kullanmayı deneyiniz.

 

3.

AltKutu(AltKutu ob) {

  super(ob);

  agr = ob.agr;

}

    

constructor’undaki super(ob) metodu, Kutu sınıfı içindeki Kutu(Kutu ob) constructor’unu etkin kılar; yani onu çalıştırır. Bu metottaki son deyim olan agr = ob.agr; deyimi  kaldırılırsa ne olur? Programı değiştirerek deneyiniz. Nedenini açıklayınız.

 


b.        Üst-sınıftaki öğelere erişme:

Bir alt-sınıf, super() metodunu kullanarak, üst sınıfının bir nesnesini yaratabilir ve onun değişkenlerine erişebilirdi.  Şimdi, üst-sınıfa ait nesne yaratmadan onun öğelerine super anahtar sözcüğü ile erişilebileceğini göstereceğiz. 

 

 

Liste 7:

Bir sınıftaki öğelere erişmek için this anahtar sözcüğünü kullanıyorduk. Ona benzer olarak super anahtar sözcüğünü kullanarak üst-sınıfın öğelerine erişebiliriz. Bunu aşağıdaki örnek üzerinde görelim.

 

 // Üst sınıfta aynı adlı öğeye erişim.

class A {

  int i;

}

 

    // Alt-sınıf tanımı

class B extends A {

  int i;       // i değişkeni B nin bir iç öğesii olduğundan,

                                   //B alt-sınıfı A ‘nın i öğesini doğrudan göremez.

 

  B(int a, int b) {

    super.i = a;      //  A içindeki  i

    i = b;            //  B içindeki i

  }

 

  void show() {

    System.out.println("i nin A ust-sınıfındaki degeri : " + super.i);

    System.out.println("i nin B alt-sınıfındaki degeri : " + i);  }

}

 

class UygulamaPrg {

  public static void main(String args[]) {

    B subOb = new B(1, 2);

 

    subOb.show();

  }

}