Java Inheritance
Türkçe karşılığı miras olan inheritance nesneyle yönelik programlamanın üç önemli kavramından bir tanesidir. Miras kavramı hakkında biraz konuşmak gerekirse, javada miras kavramı ebeveyn (ata sınıf, super class) sınıfının çocuk (oğul sınıf, sub class) sınıfına içerdiği özellikleri ve fonksiyonları miras bırakması diyebiliriz.
Peki. Bu miras kavramı ne işimize yarayacak?
Miras kavramı basit seviyede kod yazılırken bile ihtiyaç duyulan bir yapıdır. Basitce anlatmamız gerekirse bir proje yapılırken pek çok sınıfda aynı değişkenler ve metotlar bulunabilir bu durumda daha önceden yazılmış kod parçalarının tekrar tekrar farklı sınıflarda yazılmasının önüne geçmek amacıyla sınıflar birbirlerinden türeyebilirler. Bu işlem iş yükü kaybını önler ve bize zaman kazandırır. Üst sınıfların test edilmiş olduğu düşünüldüğü için dışarıdan bakıldığında güven verir. Ayrıca kalıtımın olmaması ve if-else switch-case durumlarının olması veya kalıtımın basamaklarının çok uzun olması yine kötü bir tasarıma neden olur. Bunun yerine uygun yerlerde kalıtım kullanmak çok daha mantıklıdır.
Biraz daha derine inelim.
Java inheritance aslında javanın temelinde var olan bir yapıdır. Javada kullanılan tüm sınıflar Object sınıfından türetilmiştir. Yani Object sınıfını bütün sınıfların atası veya super classı diyebiliriz. Bunun sayesinde Object sınıfındaki bütün özellikleri ve fonksiyonları sorunsuz şekilde kullanabilmekteyiz. Bunu test etmek veya kullanmak amacıyla, bir sınıfın değişken tipini bilmediğimizde bu sınıfı new operatörüyle Object sınıfına eşitleyebiliriz.
Inheritanceı kullanmaya başlamadan önce Javanın bize koyduğu ve dikkat etmemiz gereken bazı kurallar var.
1- Object sınıfı hariç bir sınıf başka bir sınıfdan miras alacaksa el uzatmak manasına gelen extends sözcüğü sınıf tanımlanırken kullanılmak zorundadır.
Inheritanceı kullanmaya başlamadan önce Javanın bize koyduğu ve dikkat etmemiz gereken bazı kurallar var.
1- Object sınıfı hariç bir sınıf başka bir sınıfdan miras alacaksa el uzatmak manasına gelen extends sözcüğü sınıf tanımlanırken kullanılmak zorundadır.
Kod:
[CENTER][LEFT]public class GreenTeam extends TurkHackTeam { }
public class Mercedes extends Araba { }[SIZE=4][COLOR=White][FONT=Calibri][/FONT][/COLOR][/SIZE][/LEFT]
[/CENTER]
Açıklamak gerekirse green team, türk hack teamin bir alt timidir ve turk hack teamin özelliklerini taşımaktadır ya da Mercedes bir arabadır. Ayrıca burada IS-A yani dır, dir ilişkisi vardır. Mercedes bir arabadır dediğmizde mercedes araba sınıfının private olarak tanımlanmamış yani public veya protected olan bütün özelliklerini alacaktır.
2- Bir sınıfın sadece tek bir atası vardır. Ama bir atanın birden fazla çocuğu olabilir.
Bu noktada mercedes bir arabadır ve audide bir arabadır örneklerini verebiliriz.
Resimde gördükleriniz Javadaki inheritance çeşitleridir.
Peki Javada neden Multiple ve Hybrid inheritance yoktur?
Şöyle bir senaryo düşünelim, C sınıfı A ve B sınıfından miras almış olsun. Hem A hem de B sınıfı Yürü adlı bir metoda sahip olsun. C sınfıından bir obje oluşturulduğunda ve Yürü metodu çağırıldığında bu metot Adan mı çağırılacak, yoksa Bden mi? Compile-time hataları, run-time hatalarından iyidir. Bu yüzden Javanın temeli olan sade ve kolay kod yazılabilmesi için multiple ve hybrid inheritance kullanılmaya çalışıldığında Compile-time hatası alırsınız.
3- Bir alt sınıf ne zaman bir üst sınıfa erişmek isterse super anahtar sözcüğünü kullanabilir. Constructor (yapılandırıcı) çağırıldığında ilk iş nesneyi yaratmaktır bu yüzden super anahtar kelimesi constructorın (yapılandırıcının) en başında olmak zorundadır.
Üst sınıftaki bir değişken ya da metot alt sınıfta aynı isimle üretildiğinde bu olaya hiding( gizleme) denir. Temiz ve sürdürülebilir bir kod için kullanılmamalıdır.
Burada super anahtar kelimesi üst sınıfa ait nesne yaratmak için (3.1) veya üst sınıfın öğelerine erişmek (3.2) için kullanılabilir.
3.1- Bir alt sınıf super() metodunu kullanarak bir üst sınıfın nesnesini yaratabilir ve onun değişkenlerine değer atayabilir.
3.2- Bir alt sınıf Super() moetodu ile bir üst sınıftan nesne yaratmadan onun öğelerine erişebilir.
4- Overriding, Üst sınıf içerisindeki bir metot ile aynı isimde bir metot alt sınıf içerisinde üreiltidiğinde bu olay üzerine yazma (overriding) olarak adlandırılır. Overriding yapılırken metotun içeriği alt sınıfa göre düzenlenebilir.
Overriding yapılan metotun bir üst satırına override yazılarak compiler tarafından üst sınıfta metotun var olup olmadığı kontrol edilebilir.
Bir örnek üzerinden hepsini gösterelim;
2- Bir sınıfın sadece tek bir atası vardır. Ama bir atanın birden fazla çocuğu olabilir.
Bu noktada mercedes bir arabadır ve audide bir arabadır örneklerini verebiliriz.
Resimde gördükleriniz Javadaki inheritance çeşitleridir.
Peki Javada neden Multiple ve Hybrid inheritance yoktur?
Şöyle bir senaryo düşünelim, C sınıfı A ve B sınıfından miras almış olsun. Hem A hem de B sınıfı Yürü adlı bir metoda sahip olsun. C sınfıından bir obje oluşturulduğunda ve Yürü metodu çağırıldığında bu metot Adan mı çağırılacak, yoksa Bden mi? Compile-time hataları, run-time hatalarından iyidir. Bu yüzden Javanın temeli olan sade ve kolay kod yazılabilmesi için multiple ve hybrid inheritance kullanılmaya çalışıldığında Compile-time hatası alırsınız.
3- Bir alt sınıf ne zaman bir üst sınıfa erişmek isterse super anahtar sözcüğünü kullanabilir. Constructor (yapılandırıcı) çağırıldığında ilk iş nesneyi yaratmaktır bu yüzden super anahtar kelimesi constructorın (yapılandırıcının) en başında olmak zorundadır.
Üst sınıftaki bir değişken ya da metot alt sınıfta aynı isimle üretildiğinde bu olaya hiding( gizleme) denir. Temiz ve sürdürülebilir bir kod için kullanılmamalıdır.
Burada super anahtar kelimesi üst sınıfa ait nesne yaratmak için (3.1) veya üst sınıfın öğelerine erişmek (3.2) için kullanılabilir.
3.1- Bir alt sınıf super() metodunu kullanarak bir üst sınıfın nesnesini yaratabilir ve onun değişkenlerine değer atayabilir.
3.2- Bir alt sınıf Super() moetodu ile bir üst sınıftan nesne yaratmadan onun öğelerine erişebilir.
4- Overriding, Üst sınıf içerisindeki bir metot ile aynı isimde bir metot alt sınıf içerisinde üreiltidiğinde bu olay üzerine yazma (overriding) olarak adlandırılır. Overriding yapılırken metotun içeriği alt sınıfa göre düzenlenebilir.
Overriding yapılan metotun bir üst satırına override yazılarak compiler tarafından üst sınıfta metotun var olup olmadığı kontrol edilebilir.
Bir örnek üzerinden hepsini gösterelim;
Kod:
[CENTER][LEFT]// Öncelikle burada isim, kilo ve boy özelliklerine, iki constructor ve bir metoda sahip bir insan sınıfı oluşturduk.
class İnsan {
String isim;
int kilo;
int boy;
İnsan( İnsan insan) {
isim = insan.isim;
kilo = insan.kilo;
boy = insan.boy;
}
İnsan( String isim, int kilo, int boy) {
this.isim = isim;
this.kilo = kilo;
this.boy = boy;
}
public **** yemekYe() {
kilo = kilo + 5;
}
}
// Burada Çocuk IS-A insandır diyerek çocuk sınıfı için insan sınıfını miras olarak aldık.
class Çocuk extends İnsan {
int sınıf;
// Constructorda super() metodunu kullanarak bir üst sınıfın özelliklerini çağırdık.
Çocuk( String isim, int kilo, int boy, int sınıf) {
super( isim, kilo, boy);
this.sınıf = sınıf;
}
// Burada bir üst sınıftaki metodun üzerine yazarak onu alt sınıfımız için yeniden düzenledik.
[USER=277185]over[/USER]ride
public **** yemekYe() {
kilo = kilo + 2;
}
**** yeniSınıf() {
sınıf++;
}
}
// Burada farklı bir sınıf oluşturduk ve birden fazla sınıfın tek bir aynı sınıftan miras alabileceğini göstermek istedik.
class Baba extends İnsan {
int yaş;
Baba( String isim, int kilo, int boy, int yaş) {
super( isim, kilo, boy);
this.yaş = yaş;
}
}
// Main classda her metodun kendi sınıfındaki yeniden yazılmış veya kendi sınıfına ait metotları kullandığını yok ise şayet miras aldığı sınıftakini olduğu gibi kullandığını gösterdik.
public class Main {
public static **** main( String[] args) {
// Öncelikle İnsan sınıfının değişken ve obje parametreli iki yeni objesini oluşturduk.
İnsan insan = new İnsan( "Ali", 80, 180);
İnsan insan2 = new İnsan( insan);
// Daha sonra İnsan sınıfının alt sınıfları olan Çocuk ve Baba sınıfının yeni objelerini oluşturduk.
Çocuk çocuk = new Çocuk( "Veli", 50, 150, 5);
Baba baba = new Baba( "Veli'nin Babası Ahmet Bey", 70, 185, 39 );
// Öncelikle hepsinin başlangıç değerlerini bastıralım.
System.out.println( "İsim:" + insan.isim + " kilo:" + insan.kilo + " boy:" + insan.boy);
System.out.println( "İsim:" + insan2.isim + " kilo:" + insan2.kilo + " boy:" + insan2.boy);
System.out.println( "İsim:" + çocuk.isim + " kilo:" + çocuk.kilo + " boy:" + çocuk.boy + " sınıf: " + çocuk.sınıf);
System.out.println( "İsim:" + baba.isim + " kilo:" + bab****ilo + " boy:" + baba.boy + " yaş:" + baba.yaş);
// Burada babanın sınıfında yemekYe metodunun olmadığını yani bunu üst sınıfı olan İnsan sınıfından direkt olarak aldığına dikkat ediniz. (Java Inheritance)
baba.yemekYe();
System.out.println();
// Babanın değişkenlerinin yeni değerlerine bakalım.
System.out.println( "İsim:" + baba.isim + " kilo:" + bab****ilo + " boy:" + baba.boy + " yaş:" + baba.yaş);
// Burada insan ve çocuk sınıfına yemekYe metotlarını kullandırtarak overrideı göstermek istedik. Aynı metot iki sınıfta farklı çalışmaktadır.
System.out.println( "insan sınıfı çıktıları");
insan.yemekYe();
// Yeni değerleri bastıralım.
System.out.println( "İsim:" + insan.isim + " kilo:" + insan.kilo + " boy:" + insan.boy);
System.out.println();
System.out.println( "çocuk sınıfı çıktıları");
çocuk.yemekYe();
// Burada çocuğun kendi sınıfına ait bir metot çalıştırarak göstermek istedik.
çocuk.yeniSınıf();
// Yeni değerleri bastıralım.
System.out.println( "İsim:" + çocuk.isim + " kilo:" + çocuk.kilo + " boy:" + çocuk.boy + " sınıf: " + çocuk.sınıf);
}
} [/LEFT]
[/CENTER]
Videolu Anlatım
[ame="https://www.youtube.com/watch?v=PVgsRkzKf4s"][ame]https://www.youtube.com/watch?v=PVgsRkzKf4s[/ame][/ame]
Kaynaklar
[url]http://bilgisayarkavramlari.sadievrenseker.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/[/URL]
[url]http://selimkaratas.com.tr/wp/javada-kalitim-inheritance.html[/URL]
[url]https://www.mobilhanem.com/java-inheritance/[/URL]
[url]https://medium.com/@denizf.b/inheritance-nedir-d4a0c2ba351a[/URL]
[url]http://mail.baskent.edu.tr/~tkaracay/etudio/ders/prg/java/ch15/super.htm[/URL]
https://www.javatpoint.com/inheritance-in-java
[ame="https://www.youtube.com/watch?v=PVgsRkzKf4s"][ame]https://www.youtube.com/watch?v=PVgsRkzKf4s[/ame][/ame]
Kaynaklar
[url]http://bilgisayarkavramlari.sadievrenseker.com/2007/04/14/inheritance-nesneler-arasi-miras-iliskisi/[/URL]
[url]http://selimkaratas.com.tr/wp/javada-kalitim-inheritance.html[/URL]
[url]https://www.mobilhanem.com/java-inheritance/[/URL]
[url]https://medium.com/@denizf.b/inheritance-nedir-d4a0c2ba351a[/URL]
[url]http://mail.baskent.edu.tr/~tkaracay/etudio/ders/prg/java/ch15/super.htm[/URL]
https://www.javatpoint.com/inheritance-in-java
Moderatör tarafında düzenlendi: