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.
Görev
KolayAynı 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) veprice(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()vegetPrice()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ındangetDetails()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
}
}
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ıKendi başına pratik yap: Online Java derleyicisi