Java - Kalıtım

Pazar, Mayıs 10, 2015 kustemura 0 Yorum


Bu yazıma bir önceki yazılarımda kullandığım örnek üzerinden devam ediyorum.
Bir önceki yazılarıma buradan ulaşabilirsiniz.Eğer bir önceki konularla ilgili bilginiz kısıtlı ise bu konuyu okumadan önce onları okumakta fayda var.
Kalıtım , Nesneye Yönelimli Programlama'nın en önemli özelliklerinden biridir.
Kalıtımı kullanarak oluşturuduğunuz alt sınıfların gizli olmayan örnek değişkenlerine ve metodlarına erişebilirsiniz.
Java'da oluşturduğunuz herhangi bir sınıf için yalnızca bir üst sınıf belirtebilirsiniz , çünkü bir alt sınıfın birden fazla türetilmesini Java desteklemez.Aşağıda Anne'den türeyen Çocuk örneği verilmektedir.
Oluşturduğunuz üst sınıflardan türeyen alt sınıflara kendilerine has özellikler ekleyerek , bir üst sınıfın özelliklerini devredebilirsiniz.

Java'da katılım yoluyla alınan sınıfa üst sınıf (superclass) ( türeten ) , kalıtımı alan ( türetilen ) sınıfa ise alt sınıf ( subclass) adı verilir.Bu yüzden alt sınıf, üst sınıfın daha özelleşmiş bir halidir.

Bir sınıftan kalıtım türetmek için Java'da extends anahtar sözcüğü kullanılır.
Aşağıdaki program Mother adında bir üst sınıf ve Child adında bir alt sınıf oluşturur.

class Mother {
 String hairColor = "Siyah";

 void theCharacteristicsOfMother() {
  System.out.println("Mother : \n " + " Saç Rengi : " + hairColor);
 }
}

class Child extends Mother {
 String eye = "Mavi";

 void theCharacteristicsOfChild() {
  System.out.println("Child :  \n " + " Saç Rengi : " + hairColor
    + " \n " + " Göz Rengi : " + eye);
 }
}

class SimpleInheritance {
 public static void main(String[] args) {
  final Mother rose = new Mother();
  final Child jack = new Child();
  jack.theCharacteristicsOfMother();
  jack.theCharacteristicsOfChild();
 }

}

Programın Çıktısı : 
Mother : 
  Saç Rengi : Siyah
Child :  
  Saç Rengi : Siyah 
  Göz Rengi : Mavi
Burada , Child alt sınıfı , üst sınıfı olan Mother sınıfının tüm üyelerini içerir.Bu yüzden jack hairColor örnek değişkenine erişebilir ve theCharacteristicsOfMother methodunu çağırabilir.Yani burada jack saç rengini annesinden almıştır , fakat göz rengi kendine has bir özelliktir.Mother , Child için bir üst sınıf olmasına rağmen tamamen bağımsız bir sınıftır. Üst sınıftan kalıtımı devralan bir alt sınıf deklerasyonu şu şekilde olmalıdır :
 
class alt-sinif-adi extends ust-sinif-adi{
 //Sınıfın Gövdesi
}
Kalıtım'da Üye Erişimi Bir alt sınıf , üst sınıfın tüm üyelerini içermesine rağmen private olarak tanımlı olan hiçbir üyesine erişemez.
Örneğimiz üzerinden devam edelim.
class Mother {
 String hairColor = "Siyah";
 private final String gender = "Kadın";

 void theCharacteristicsOfMother() {
  System.out.println("Mother : \n " + " Saç Rengi : " + hairColor
    + " Cinsiyet : " + gender);
 }
}

class Child extends Mother {
 String eye = "Mavi";

 void theCharacteristicsOfChild() {
  System.out.println("Child :  \n " + " Saç Rengi : " + hairColor
    + " \n " + " Göz Rengi : " + eye + " Cinsiyet : " + gender); 
  // Burada gender örnek değişkenine erişelemez ,
        //  program derlenmeden sonlanır.
 }
}

class SimpleInheritance {
 public static void main(String[] args) {
  final Mother rose = new Mother();
  final Child jack = new Child();
  jack.theCharacteristicsOfMother();
  jack.theCharacteristicsOfChild();

 }

}

Daha iyi bir örnekle anlatmaya çalışacağım,önceki derslerde Rectangle sınıfı üzerinden örnekler vermiştir , aynı sınıf ve yapı üzerinden örneklerimize devam edelim. Box sınıfını genişleterek yeni bir özellik daha ekliyoruz , 3 özelliğimiz vardı(width , height , depth) eklenen özellik weight olsun .Bu şekilde dikdörtgenimizin genişliği,yüksekliği,derinliği ve ağırlığı oldu.
class Rectangle {
 double width;
 double height;
 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) {
  width = clone.width;
  height = clone.height;
  depth = clone.depth;
  weight = clone.weight;
 }

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

 }

 RectangleWeight() {
  width = -1;
  height = -1;
  depth = -1;
  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);
 }
}
Programın Çıktısı : 
(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


Burada RectangleWeight , Rectangle sınıfının özelliklerini kalıtım yoluyla devralır ve onlara weight özelliğinide ekler.Bir kez daha genişletelim.
class ColorRectangle extends Rectangle {
  String color;

 ColorRectangle(double width,double height,double depth,String c){
  this.width = width;
  this.height = height;
  this.depth = depth;
  color = c;

 }
}
Burada ise Rectangle sınıfınımızı genişletip bir renk özelliği verdik.

0 yorum :