Menu
Coddy logo textTech

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'dan

Object'in her zincirin en üstünde yer aldığını unutma. Dolayısıyla Dog sınıfımızın aslında dört seviyesi vardır: Object -> Animal -> Mammal -> Dog. Yeni bir nesne oluşturulurken yapıcı zincirlemesi tüm bu seviyeler boyunca ilerler.

challenge icon

Görev

Kolay

Hem tekli hem de çok seviyeli kalıtım desenlerini gösteren bir ulaşım hiyerarşisi oluşturalım. Her seviyenin yeni yetenekler eklediği bir sınıf zinciri oluşturacak ve metotların birden fazla seviye boyunca nasıl miras alındığını göstereceksin.

Kodunu dört dosya arasında düzenleyeceksin:

  • Vehicle.java: Hiyerarşinin en üstünde temel sınıfı oluştur. Her aracın şunlara sahip olması gerekir:
    • brand (String) için bir private alan
    • brand değerini kabul eden bir constructor
    • brand değerini döndüren bir getBrand() metodu
    • Şunu yazdıran bir move() metodu: [brand] is moving
  • LandVehicle.java: Çok seviyeli zincirinin orta seviyesini temsil eden ve Vehicle sınıfını genişleten bir sınıf oluştur. Kara araçları, karaya özgü davranışlar ekler:
    • wheels (int) için bir private alan
    • brand ve wheels değerlerini alan, üst sınıfa ait kısım için super(brand) kullanan bir constructor
    • Tekerlek sayısını döndüren bir getWheels() metodu
    • Şunu yazdıran bir honk() metodu: [brand] honks!
  • Car.java: Üç seviyeli kalıtım zincirini tamamlayarak LandVehicle sınıfını genişleten bir sınıf oluştur. Arabalar kendi özel özelliklerini ekler:
    • model (String) için bir private alan
    • brand, wheels ve model değerlerini alan, super(brand, wheels) kullanan bir constructor
    • model değerini döndüren bir getModel() metodu
    • Şunu yazdıran bir displayInfo() metodu: [brand] [model] with [wheels] wheels
  • Main.java: Bir Car nesnesinin hiyerarşinin üç seviyesindeki metotlara nasıl erişebildiğini göster. Üç girdi alacaksın: brand (String), wheels (int) ve model (String). Bir Car oluştur ve bu metotları sırayla çağır:
    • move() - Vehicle sınıfından (büyükanne/büyükbaba sınıfı) miras alınır
    • honk() - LandVehicle sınıfından (üst sınıf) miras alınır
    • displayInfo() - doğrudan Car sınıfında tanımlanır

Üç girdi alacaksın: brand adı, tekerlek sayısı ve model adı.

Çıktın, Car nesnesinin kalıtım zincirinin her seviyesindeki metotları nasıl kullanabildiğini gösteren üç satır içermelidir — en üst seviyedeki Vehicle sınıfından kendi sınıfına kadar!

GEREKLİ ÇIKTI BİÇİMİ: [Çevrilmiş içeriğin burada]

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ı
    }
}
quiz iconKendini test et

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

Kendi başına pratik yap: Online Java derleyicisi