Menu
Coddy logo textTech

Yapıcı Metot Zincirleme

Coddy'nin Java Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 23 / 87.

Yapıcı zincirleme, bir yapıcının başka bir yapıcıdan çağrılması sürecidir. Bu teknik, bir sınıfın birden fazla yapıcısı olduğunda veya kalıtım hiyerarşileriyle çalışırken kod tekrarını önlemeye yardımcı olur.

Aynı sınıf içinde this() kullanarak oluşturucuları zincirleyebilirsin. Bu, tüm işi yapan bir "ana" oluşturucuya sahip olmanı sağlarken diğer oluşturucuların yalnızca ona devretmesine olanak tanır:

public class Rectangle {
    private int width;
    private int height;
    
    public Rectangle() {
        this(1, 1);  // İki parametreli kurucuyu çağırır
    }
    
    public Rectangle(int size) {
        this(size, size);  // Bir kare oluşturur
    }
    
    public Rectangle(int width, int height) {
        this.width = width;
        this.height = height;
    }
}

Kalıtımda, yapıcı zincirleme işlemi otomatik olarak gerçekleşir. Bir alt sınıf nesnesi oluşturduğunuzda Java, önce super() kullanarak üst sınıfın yapıcısını çağırır. super() çağrısını açıkça yapmazsanız Java, super() ifadesini (bağımsız değişken almayan sürümünü) otomatik olarak ekler:

public class Animal {
    private String name;
    
    public Animal(String name) {
        this.name = name;
        System.out.println("Animal constructor");
    }
}

public class Dog extends Animal {
    private String breed;
    
    public Dog(String name, String breed) {
        super(name);  // İlk satır olmalıdır
        this.breed = breed;
        System.out.println("Dog constructor");
    }
}

new Dog("Buddy", "Labrador") oluşturulduğunda önce "Animal constructor", ardından "Dog constructor" yazdırılır. Bu, alt sınıf kendi kurulumunu eklemeden önce üst sınıfların her zaman düzgün bir şekilde başlatılmasını sağlar.

challenge icon

Görev

Kolay

Aynı sınıf içinde ve bir kalıtım hiyerarşisi boyunca kurucu zincirlemesini gösteren bir ürün sipariş sistemi oluşturalım. this() ifadesinin aynı sınıftaki kurucuları nasıl zincirlediğini, super() ifadesinin ise üst sınıf kurucularına nasıl zincirlediğini göreceksin.

Kodunu düzenlemek için üç dosya oluşturacaksın:

  • Product.java: Bir mağazadaki herhangi bir ürünü temsil eden bir üst sınıf oluştur. Şunlara sahip olmalı:
    • name (String) ve price (double) için private alanlar
    • Hem name hem de price alan parametresiz olmayan bir ana kurucu; alanları başlatmalı ve şunu yazdırmalı: Product constructor: [name]
    • Yalnızca name alan ve varsayılan fiyatı 0.0 olarak ayarlamak için this(name, 0.0) kullanarak ana kurucuya zincirlenen ikinci bir kurucu
    • Alanlara erişmek için getName() ve getPrice() metotları
  • Electronics.java: Product sınıfını genişleten ve garanti bilgisi ekleyen bir alt sınıf oluştur:
    • warrantyYears (int) için private bir alan
    • name, price ve warrantyYears alan bir ana kurucu — üst sınıfı başlatmak için super(name, price) kullan; ardından garantiyi ayarla ve şunu yazdır: Electronics constructor: [warrantyYears] year warranty
    • Yalnızca name ve price alan, varsayılan 1 yıllık garanti sağlamak için this(name, price, 1) ile ana kurucuya zincirlenen ikinci bir kurucu
    • Yalnızca name alan ve this(name, 0.0) ile ikinci kurucuya zincirlenen üçüncü bir kurucu
    • Şunu döndüren bir getDetails() metodu: [name] - $[price] ([warrantyYears] year warranty)
  • Main.java: Kurucu zincirlemesini çalışırken göster. Üç girdi alacaksın: bir ürün adı (String), fiyat (double) ve garanti yılı (int). Tüm bu parametreleri kullanarak bir Electronics nesnesi oluştur, ardından getDetails() sonucunu yazdır.

Üç girdi alacaksın: ürün adı, fiyat ve garanti yılı.

Fiyatı getDetails() içinde String.format("%.2f", price) kullanarak 2 ondalık basamak gösterecek şekilde biçimlendir. Çıktıyı dikkatlice incele — kurucu mesajlarının sırayla göründüğünü ve zincirin üst sınıftan alt sınıfa nasıl ilerlediğini göreceksin!

Kendin dene

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Girdileri oku
        String name = scanner.nextLine();
        double price = scanner.nextDouble();
        int warrantyYears = scanner.nextInt();
        
        // TODO: Her üç parametreyi de kullanarak bir Electronics nesnesi oluşturun
        
        // TODO: getDetails() sonucunu yazdırın
    }
}
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