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 (Constructor chaining), bir yapıcının diğerinden çağrılması işlemidir. 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 yapıcıları (constructors) birbirine bağlayabilirsiniz. Bu, tüm işi yapan bir "ana" yapıcıya sahip olmanızı sağlarken, diğer yapıcıların sadece ona yetki devretmesine (delegate) 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 (constructor chaining) otomatik olarak gerçekleşir. Bir alt sınıf nesnesi oluşturduğunuzda, Java önce super() kullanarak üst sınıf yapıcısını çağırır. Eğer super() ifadesini açıkça çağırmazsanız, Java otomatik olarak super() (argümansız sürüm) 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şturmak, önce "Animal constructor", ardından "Dog constructor" yazdırır. Bu, alt sınıf kendi kurulumunu eklemeden önce ebeveyn sınıfların her zaman düzgün bir şekilde başlatılmasını sağlar.
Görev
KolayHem bir sınıf içinde hem de bir kalıtım hiyerarşisi boyunca yapıcı zincirlemesini (constructor chaining) gösteren bir ürün sipariş sistemi oluşturalım. this() ifadesinin aynı sınıftaki yapıcıları nasıl zincirlediğini, super() ifadesinin ise üst sınıf yapıcılarına nasıl bağlandığını göreceksiniz.
Kodunuzu düzenlemek için üç dosya oluşturacaksınız:
Product.java: Bir mağazadaki herhangi bir ürünü temsil eden bir üst sınıf oluşturun. Şunlara sahip olmalıdır:name(String) veprice(double) için özel (private) alanlar- Hem adı hem de fiyatı alan, alanları başlatan ve şunu yazdıran bir ana yapıcı:
Product constructor: [name] - Yalnızca adı alan ve varsayılan fiyatı 0.0 olarak ayarlamak için
this(name, 0.0)kullanarak ana yapıcıya zincirlenen ikinci bir yapıcı - 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şturun:warrantyYears(int) için özel bir alan- Ad, fiyat ve warrantyYears alan bir ana yapıcı - üst sınıfı başlatmak için
super(name, price)kullanın, ardından garantiyi ayarlayın ve şunu yazdırın:Electronics constructor: [warrantyYears] year warranty - Yalnızca ad ve fiyat alan, varsayılan 1 yıllık garanti sağlamak için
this(name, price, 1)ile ana yapıcıya zincirlenen ikinci bir yapıcı - Yalnızca adı alan ve
this(name, 0.0)ile ikinci yapıcıya zincirlenen üçüncü bir yapıcı - Şunu döndüren bir
getDetails()metodu:[name] - $[price] ([warrantyYears] year warranty)
Main.java: Yapıcı zincirlemesini iş başında gösterin. Üç girdi alacaksınız: bir ürün adı (String), fiyat (double) ve garanti süresi (int). Her üç parametreyi de kullanarak bir Electronics nesnesi oluşturun, ardındangetDetails()sonucunu yazdırın.
Üç girdi alacaksınız: ürün adı, fiyat ve garanti süresi.
getDetails() içindeki fiyatı, String.format("%.2f", price) kullanarak 2 ondalık basamak gösterecek şekilde biçimlendirin. Çıktıyı dikkatlice izleyin - yapıcı mesajlarının sırayla göründüğünü ve zincirin üst sınıftan alt sınıfa nasıl aktığını göreceksiniz!
Kopya kağıdı
Yapıcı zincirleme (Constructor chaining), kod tekrarını önlemek için bir yapıcının diğerinden çağrılması işlemidir.
Aynı Sınıf İçinde Zincirleme
Aynı sınıftaki başka bir yapıcıyı çağırmak için this() kullanın:
public class Rectangle {
private int width;
private int height;
public Rectangle() {
this(1, 1); // Calls the two-parameter constructor
}
public Rectangle(int size) {
this(size, size); // Creates a square
}
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
}Kalıtımda Zincirleme
Üst sınıf yapıcısını çağırmak için super() kullanın. Bu, yapıcıdaki ilk satır olmalıdır:
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); // Must be first line
this.breed = breed;
System.out.println("Dog constructor");
}
}Eğer super() ifadesini açıkça çağırmazsanız, Java otomatik olarak super() (argümansız sürüm) ekler. Üst sınıf yapıcıları her zaman alt sınıf yapıcılarından önce çağrılır ve bu da uygun başlatma sırasını sağlar.
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ı