Java’da Inheritance(miras) Nedir?

Java Duke melic.com
Java Duke melic.com

Mısır’daki olmayan akrabalardan kalan miras konusu olmasını tercih ederdim ama işte maalesef Tatooine’deki akrabalardan kalan miras söz konusu.

Inheritance yani Miras!
OOP – Object Oriented Programming yani Nesne Yönelimli Programlamanın en gösterişli prensibi herhalde miras olsa gerek. Sınıfların diğer sınıflardan türetilebildiği ve alt sınıfların üst sınıflara ait alanlar ve metotları da miras aldığını ifade etmektedir.

Üst sınıfları superclass (üstünsınıf ya da süpersınıf) ve türetilmiş yani çocuk sınıfları ise subclass (altsınıf) olarak tanımlarız.

Burada size birde CLASS yani Sınıf nedir basit bir örnek vermeliyim.

class_ornek

Yukarıdaki resimde Omurgalılar SuperClass ve Memeliler de basitçe subclass. Bu bağlamda bir üst sınıf birden farklı altsınıfları etkileyebilir ve altsınıflar bazı özellikleri ile benzerlik gösterebilir.

Gelin Araba sınıfı örneğinden devam edelim. Araba çok genel bir tip ve biz programımızda daha özel bir şey arıyor olabiliriz, mesela “AileArabasi” ve “SporAraba” gibi. Bunların ikisi subclass(altsınıf) olarak superclass(üstsınıf) olan Araba sınıfına ait tüm “fields”(alanlar) ve “method”(metot)ları miras olarak sahip olacak; ki bunlar her sınıf için kendine ait özellikleri olacaktır.

Eğer aile arabası söz konusu ise bizim için koltuk sayısı önem kazanacak, AileArabasi sinifi tanımlamasıda şöyle olacaktır :


public AileArabasi extends Araba {
 /* türettiğimiz (extend) için kapadığımız alanlar
 String model;
 String noPlaka;
 String renk;
 int noKapi; */
 int noKoltuk;

// Yapıcı Fonksiyon(Constructor function)

public AileArabasi(String model, String noPlaka, String renk, int noKapi, int yeniNoKoltuk) {
 super(model,noPlaka,renk,noKapi);
 noKoltuk = yeniNoKoltuk;
 }

/* devralınan metotlar:
 void basla(
         System.out.println("Araba Çalıştı!");
){}
 void sur(){}
 void elfreni(){}
 */
 }

Buradaki iki anahtar kelime extends ve super()’dir. Birincisi JVM’ye yeni sınıfın Araba özelliklerini devralması gerektiğini söyler. İkincisi, devralınan alanları başlatmak için Car yapıcısını(constructor) çağırır.

Super() yönteminin(method) yapıcıdaki (constructor) ilk ifade olması gerekir, aksi takdirde bir hata atılır.

SportsCar sınıfı hemen hemen aynı görünecektir, ancak burada motorun turboşarjlı olup olmadığını bilmek mantıklıdır:


public SporAraba extends Araba {
  boolean turboCharged;

  public SporAraba (String model, String  noPlaka, String renk, int noKapi, boolean turbo) 
  {
      super(model,noPlaka,renk,noKapi);
      turboCharged = turbo;
  }
 }

Daha sonra değişkenleri şu şekilde bildirebiliriz:

Araba araba = new Araba ("genelAraba","5332V","gri",4);
AileArabasi fCar = new AileArabasi ("aileArabasi ","1059S", "bej", 4, 7);
SporAraba sCar = new SporAraba ("sporAraba","BH93A","kirmizi", 2, true);

Yukarıdan gelen kalıtım nedeniyle, açıkça beyan etmemiş olsak bile tüm nesneler için start() yöntemini çağırabiliriz:

car.basla();
fCar.basla();
sCar.basla();

Ve çıktı şöyle olacaktır :

Araba Çalıştı!
Araba Çalıştı!
Araba Çalıştı!

Veya diğer miras alınabilecek alanlar :

System.out.println(fCar.noKapi);
 System.out.println(sCar.noKapi);

// 4
// 2

Bir süper sınıf beklediğinizde, bir alt sınıfın da geçerli bir girdi olduğunu unutmayın:

void test(Araba araba){
araba.basla();
}

test(fCar); //valid
test(sCar); //valid

Not: Bir sınıf sadece tek bir super sınıf(superclass) genişletebilir(extend)

About the Author

Melih Melik SÖNMEZ
1976'da İstanbul'da doğdum.