super Anahtar Sözcüğü
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.uyeBurada 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 :