super Anahtar Sözcüğü

Salı, Mayıs 12, 2015 kustemura 0 Yorum


Bir önceki  Java - Kalıtım adlı yazımdan kaldığım yerden devam ediyorum.
Önceki konularda kullandığımız örnekler bu yazımda da devam etmektedir.

Örneğin , RectangleWeight'in (subclasss) yapılandırıcısı , Rectangle ( superclass )'ın width,height ve depth alanlarına açıkca değer ataması yapabilir.Bu işlem yalnızca üst sınıftan kodu kopyalayıp verimi azaltmaz , aynı zamanda bir alt sınıfın üyelere erişimini de sağlar.
Üst sınıfın alanlarını kapatmak isteyeceğimiz ( yani , veri üyelerini private olarak korumak) zamanlar olucaktır. Bu durumda bir önceki örneklerde kullandığımız yapıyı kullanamayız.Bu yöntem ise Sarmalama olarak adlandırılır.Nesneye yönelimli programlamanın birincil özellikliğidir.
Bir alt sınıfın , üst sınıfına göndermede bulunması gerekirse bunu super anahtar sözcüğünü kullanarak yapmalıyız.
super anahtar sözcüğünün iki genel formu vardır,Birincisi  , üst sınıfın yapılandırıcısını çağırır.İkincisi ise bir üst sınıfın,bir alt sınıf üyesi tarafından gizlenen bir üyesine erişmek için kullanılır.

1 - Üst Sınıf Yapılandırıcılarını Çağırmak İçin super Kullanmak

class Rectangle {
 private final double width;
 private final double height;
 private final double depth;

 Rectangle(Rectangle clone) {
  width = clone.width;
  height = clone.height;
  depth = clone.depth;
 }

 Rectangle(double width, double height, double depth) {
  this.width = width;
  this.height = height;
  this.depth = depth;
 }

 Rectangle() {
  width = -1;
  height = -1;
  depth = -1;
 }

 double volume() {
  return width * height * depth;
 }

}

class RectangleWeight extends Rectangle {
 double weight;

 RectangleWeight(RectangleWeight clone) {
  super(clone);
  weight = clone.weight;
 }

 RectangleWeight(double width, double height, double depth, double weight) {
  super(width, height, depth);
  this.weight = weight;

 }

 RectangleWeight() {
  super();
  weight = -1;
 }

}

class DemoRectangleWeight {
 public static void main(String[] args) {
  final RectangleWeight myRectangle = new RectangleWeight(5, 10, 15, 25);
  final RectangleWeight myRectangle2 = new RectangleWeight(myRectangle);

  System.out.println("(myRectangle için)\nDikdörtgenin Hacmi :  "
    + myRectangle.volume());
  System.out.println("Dikdörtgenin Ağırlığı : " + myRectangle.weight);
  System.out.println();
  System.out.println("(myRectangle2 için)\nDikdörtgenin Hacmi  : "
    + myRectangle2.volume());
  System.out.println("Dikdörtgenin Ağırlığı : " + myRectangle2.weight);
 }
}
(myRectangle için)
Dikdörtgenin Hacmi :  750.0
Dikdörtgenin Ağırlığı : 25.0

(myRectangle2 için)
Dikdörtgenin Hacmi  : 750.0
Dikdörtgenin Ağırlığı : 25.0

Bu programın çıktısı da bir önceki yazımda yazdığım program ile aynıdır.

RectangleWeight(double width, double height, double depth, double w) {
  this.width = width;
  this.height = height;
  this.depth = depth;
  weight = w;
 
 }
Yani bu program ile ,
RectangleWeight(double width, double height, double depth, double w) {
  super(width, height, depth);
  weight = w;

 }
bu programın yaptığı iş aynıdır.Fakat ikinci program hem verimliliği arttırır , tekrarlamayı önler ve ayrıca Sarmalama özelliğini birebir uygular.

2 - super'in İkinci Bir Kullanımı

super'in ikinci kullanımı bir açıdan this gibidir.Tek farkı,her zaman , kullanıldığı alt sınıfın üst sınıfına göndermede bulunuyor olmasıdır.


super.uye
Burada ki uye , ya bir method ya da bir örnek değişkendir. super'in bu ikinci kullanımı , bir alt sınıfın üye adlarının , üst sınıf içinde ki aynı adlı üyeler ile gizlendiği durumlarda çok sık görülür.Bunu bir örnek ile inceleyelim.
class A {
 int i;
}

class B extends A {
 int i;

 B(int a, int b) {
  super.i = a;
  i = b;
 }

 void show() {
  System.out.println(" Superclass i = " + super.i);
  System.out.println(" Subclass i = " + i);
 }
}

class useSuper {
 public static void main(String[] args) {
  final B subClone = new B(1, 2);

  subClone.show();
 }
}
 Superclass i = 1
 Subclass i = 2

B'deki i örnek değişkeni A'dakini gizlemesine rağmen super , üst sınıf içerisinde tanımlanan i'ye erişime izin verir.Gördüğünüz gibi super , ayrıca alt sınıf tarafından gizlenen methodları çağırmak için de kullanılabilir.

0 yorum :