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.0Bu 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 = 2B'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 :