Tekli ve Çok Seviyeli Kalıtım
Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 25 / 87.
Şu ana kadar, sınıfların doğrudan bir ana sınıfı genişlettiğini gördük. Ancak kalıtım, sınıfların birbirleriyle nasıl ilişkilendiğine bağlı olarak farklı yapılar oluşturabilir. İki ana deseni inceleyelim: tekli kalıtım ve çok seviyeli kalıtım.
Tekli kalıtım, şimdiye kadar kullandığımız yöntemdir. Bir sınıf, doğrudan tam olarak bir üst sınıfı genişletir:
public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }Burada, hem Dog hem de Cat, Animal sınıfından miras alır, ancak birbirlerinden miras almazlar. Her alt sınıfın bir doğrudan üst sınıfı vardır.
Çok seviyeli kalıtım, bir sınıfın başka bir sınıfı genişlettiği ve o sınıfın da başka bir sınıfı genişlettiği bir zincir oluşturur:
public class Animal {
public void eat() {
System.out.println("Eating");
}
}
public class Mammal extends Animal {
public void breathe() {
System.out.println("Breathing");
}
}
public class Dog extends Mammal {
public void bark() {
System.out.println("Barking");
}
}Bu zincirde, Dog sınıfı Mammal sınıfından, o da Animal sınıfından miras alır. Bir Dog nesnesi, tüm zincirdeki tüm metotlara erişebilir:
Dog dog = new Dog();
dog.eat(); // Animal'dan
dog.breathe(); // Mammal'dan
dog.bark(); // Dog'danObject'in her zincirin en tepesinde yer aldığını unutmayın. Yani Dog nesnemiz aslında dört seviyeye sahiptir: Object -> Animal -> Mammal -> Dog. Yeni bir nesne oluşturulurken yapıcı zincirleme (constructor chaining) tüm bu seviyelerden geçer.
Görev
KolayHem tekli hem de çok seviyeli kalıtım (multilevel inheritance) desenlerini gösteren bir ulaşım hiyerarşisi oluşturalım. Her seviyenin yeni yetenekler eklediği bir sınıflar zinciri oluşturacak ve metotların birden fazla seviye boyunca nasıl miras alındığını göreceksiniz.
Kodunuzu dört dosya halinde düzenleyeceksiniz:
Vehicle.java: Hiyerarşinizin en tepesindeki temel sınıfı oluşturun. Her aracın şunlara sahip olması gerekir:brand(String) için özel (private) bir alan- Markayı (brand) kabul eden bir yapıcı (constructor)
- Markayı döndüren bir
getBrand()metodu - Şunu yazdıran bir
move()metodu:[brand] is moving
LandVehicle.java: Çok seviyeli zincirinizin orta seviyesini temsil eden, Vehicle sınıfını genişleten (extends) bir sınıf oluşturun. Kara araçları zemine özgü davranışlar ekler:wheels(int) için özel (private) bir alan- Marka ve tekerlek sayısını alan, üst sınıf kısmı için
super(brand)kullanan bir yapıcı - Tekerlek sayısını döndüren bir
getWheels()metodu - Şunu yazdıran bir
honk()metodu:[brand] honks!
Car.java: LandVehicle sınıfını genişleten ve üç seviyeli kalıtım zincirinizi tamamlayan bir sınıf oluşturun. Arabalar kendi özelleşmiş özelliklerini ekler:model(String) için özel (private) bir alan- Marka, tekerlek sayısı ve modeli alan,
super(brand, wheels)kullanan bir yapıcı - Modeli döndüren bir
getModel()metodu - Şunu yazdıran bir
displayInfo()metodu:[brand] [model] with [wheels] wheels
Main.java: Bir Car nesnesinin hiyerarşinin her üç seviyesindeki metotlara nasıl erişebildiğini gösterin. Üç girdi alacaksınız: marka (String), tekerlek sayısı (int) ve model (String). Bir Car nesnesi oluşturun ve şu metotları sırasıyla çağırın:move()- Vehicle sınıfından miras alınan (büyük ebeveyn)honk()- LandVehicle sınıfından miras alınan (ebeveyn)displayInfo()- Car sınıfının kendisinde tanımlanan
Üç girdi alacaksınız: marka adı, tekerlek sayısı ve model adı.
Çıktınız, Car nesnesinin kalıtım zincirinin her seviyesindeki metotları -en üst seviyedeki Vehicle sınıfından kendi sınıfına kadar- nasıl kullanabildiğini gösteren üç satır olmalıdır!
Kopya kağıdı
Java farklı kalıtım yapılarını destekler. İki ana model tekli kalıtım ve çok seviyeli kalıtımdır.
Tekli kalıtım, bir sınıfın doğrudan tam olarak bir üst sınıfı genişletmesiyle gerçekleşir:
public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }Hem Dog hem de Cat sınıfları Animal sınıfından kalıtım alır, ancak birbirlerinden almazlar.
Çok seviyeli kalıtım, bir sınıfın başka bir sınıfı genişlettiği, o sınıfın da başka bir sınıfı genişlettiği bir zincir oluşturur:
public class Animal {
public void eat() {
System.out.println("Eating");
}
}
public class Mammal extends Animal {
public void breathe() {
System.out.println("Breathing");
}
}
public class Dog extends Mammal {
public void bark() {
System.out.println("Barking");
}
}Çok seviyeli kalıtımda, bir alt sınıf tüm kalıtım zincirindeki tüm metotlara erişebilir:
Dog dog = new Dog();
dog.eat(); // Animal sınıfından
dog.breathe(); // Mammal sınıfından
dog.bark(); // Dog sınıfındanHer sınıf hiyerarşisinin en tepesinde Object bulunur. Yeni bir nesne oluşturulurken yapıcı zinciri (constructor chaining) tüm seviyelerden geçer.
Kendin dene
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Girdileri oku
String brand = scanner.nextLine();
int wheels = scanner.nextInt();
scanner.nextLine(); // yeni satırı tüket
String model = scanner.nextLine();
// TODO: Giriş değerleri ile bir Car nesnesi oluşturun
// TODO: move() metodunu çağırın - Vehicle sınıfından (büyük ebeveyn) miras alındı
// TODO: honk() metodunu çağırın - LandVehicle sınıfından (ebeveyn) miras alındı
// TODO: displayInfo() metodunu çağırın - Car sınıfının kendisinde tanımlandı
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarOOP'ye GirişSınıflar ve Nesnelerthis Anahtar KelimesiMetotlarAlanlar (Öznitelikler)Yapıcı MetotYapıcı Metot Aşırı YüklemeÖzet - Basit Hesap Makinesi4Kalıtım
Temel Kalıtım (extends)super Anahtar KelimesiMetot Geçersiz Kılma (@Override)Yapıcı Metot ZincirlemeObject SınıfıTekli ve Çok Seviyeli KalıtımNeden Çoklu Sınıf Kalıtımı Yok?Özet - Çalışan Hiyerarşisi7Özel Metotlar ve Object Sınıfı
toString() Metoduequals() ve hashCode()clone() MetoducompareTo() ve ComparableComparator ArayüzüÖzet - Özel Sıralama2Erişim Belirleyiciler ve Kapsülleme
Erişim Seviyelerine Genel BakışGetter ve Setter MetotlarıBilgi Gizlemefinal Anahtar KelimesiÖzet - Banka Hesabı Yöneticisi5Polimorfizm
Metot Aşırı Yükleme TemelleriMetot Geçersiz Kılma (Çalışma Zamanı)Upcasting ve Downcastinginstanceof OperatörüSoyut Sınıflar ve MetotlarÖzet - Şekil Hesaplayıcı8İleri Düzey OOP Kavramları
Kompozisyon vs KalıtımAgregasyon vs KompozisyonDahili, Yuvalanmış ve Anonim SınıflarEnum'lar ve Enum MetotlarıRecords (Java 16+)Sealed Classes (Java 17+)11Tasarım Kalıpları Bölüm 1
Tasarım Kalıplarına GirişSingleton KalıbıFactory KalıbıBuilder KalıbıObserver KalıbıStrategy Kalıbı14Final Meydan Okumaları
E-Öğrenme PlatformuBankacılık SistemiOyun Karakteri GeliştirmeAraç Kiralama Servisi3Sınıf Özellikleri ve Statik Üyeler
Instance ve Statik DeğişkenlerStatik MetotlarStatik BloklarSabitler (static final)Özet - Sayaç ve Utility6Arayüzler ve Soyut Sınıflar
Arayüzlere GirişArayüzleri UygulamaÇoklu Arayüz UygulamaArayüzlerde Default ve StaticSoyut Sınıflar ve ArayüzlerFonksiyonel ArayüzlerÖzet - Ödeme Sistemi9Generics
Generics'e GirişGeneric SınıflarGeneric MetotlarSınırlandırılmış Tip ParametreleriWildcard'lar (?, extends, super)Özet - Generic Container12Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıKompozit KalıbıYineleyici Kalıbı