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 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.

challenge icon

Görev

Kolay

Hem 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ından

Her 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ı
    }
}
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