Constructor'lar (Yapıcılar)
Constructor (yapıcı), bir nesne new ile oluşturulurken otomatik çağrılan özel bir metottur. Görevi, nesneyi geçerli bir başlangıç durumuna getirmektir — alanları anlamlı değerlerle doldurmak. İyi tasarlanmış construct…
Constructor'lar (Yapıcılar)
Constructor (yapıcı), bir nesne new ile oluşturulurken otomatik çağrılan özel bir metottur.
Görevi, nesneyi geçerli bir başlangıç durumuna getirmektir — alanları anlamlı değerlerle
doldurmak. İyi tasarlanmış constructor'lar, bir nesnenin oluştuğu andan itibaren tutarlı (geçersiz
duruma asla düşmeyen) olmasını sağlar. OOP temellerinde değindik; burada tüm biçimlerini ve
inceliklerini derinlemesine ele alıyoruz.
Constructor'ın özellikleri
- Adı sınıf adıyla aynıdır.
- Dönüş tipi yoktur (
voidbile değil) — onu metottan ayıran budur. newile nesne oluşturulurken otomatik çağrılır.
class Urun { String ad; Urun(String ad) { this.ad = ad; } // constructor } new Urun("Klavye"); // constructor çağrılır
Varsayılan constructor
Hiç constructor yazmazsan, derleyici parametresiz, boş bir varsayılan constructor ekler. Ama parametreli bir constructor yazarsan, derleyici artık varsayılanı eklemez — gerekiyorsa kendin yazmalısın:
class A { } // derleyici A() ekler class B { B(int x){} } // B() YOK; new B() derlenmez (kendin eklemelisin)
Aşırı yükleme (overloading) ve this()
Farklı parametre listeleriyle birden çok constructor tanımlayabilirsin (overloading). Kod
tekrarını önlemek için, biri diğerini this(...) ile çağırır (constructor zincirleme):
Urun() { this("İsimsiz", 0, 0); } // tam constructor'a delege Urun(String ad, double f) { this(ad, f, 0); } Urun(String ad, double f, int stok) { ... } // asıl başlatma TEK yerde
this(...) constructor'ın ilk satırı olmalıdır. Örnek 1 (./Ornek1.java) varsayılan/
parametreli/aşırı yüklenmiş constructor'ları ve this() zincirlemesini gösterir.
Kalıtımda super()
Kalıtımda nesne kurulurken önce üst sınıf constructor'ı çalışır (taban hazır olmadan alt sınıf
kurulamaz). super(...) üst sınıf constructor'ını çağırır:
class Otomobil extends Arac { Otomobil(String marka, int kapi) { super(marka); // ÜST constructor — ilk satır this.kapi = kapi; } }
super(...)constructor'ın ilk satırı olmalıdır.- Yazmazsan derleyici parametresiz
super()'i örtük ekler. Üst sınıfta parametresiz constructor yoksa hata alırsın — o zaman açıkçasuper(...)çağırmalısın.
Örnek 2 (./Ornek2.java) super() zincirini (önce üst, sonra alt) ve bir kopya
constructor'ını (var olan nesneden bağımsız kopya) gösterir.
Başlatma sırası (tam)
Bir nesne kurulurken (topic 41 ile tutarlı):
- (İlk kez) üst → alt static alanlar + static bloklar (bir kez).
- Üst sınıf: alan başlatmaları + instance bloklar → üst constructor gövdesi.
- Alt sınıf: alan başlatmaları + instance bloklar → alt constructor gövdesi.
İyi uygulamalar
- Nesneyi her zaman geçerli bir durumda oluştur (zorunlu alanları constructor parametresi yap; doğrulamayı constructor'da yap).
- Çok sayıda/opsiyonel parametre varsa Builder deseni kullan (topic 37).
- Değişmez (immutable) nesneler için tüm alanları
finalyapıp constructor'da ata. - Constructor içinde override edilebilir metot çağırma (alt sınıf henüz kurulmamışken çalışabilir — sinsi hata).
Özet
Constructor'ların nesneyi geçerli başlangıç durumuna getirdiğini; varsayılan/parametreli/aşırı
yüklenmiş biçimleri ve this() zincirlemesini (Örnek 1); kalıtımda super() zincirini, başlatma
sırasını ve kopya constructor'ı (Örnek 2) öğrendik; iyi uygulamalara (geçerlilik, Builder,
immutability) değindik. Nesne başlatmayı doğru yapmak, sağlam OOP'nin temelidir.
▶ Kod Örnekleri(2)
Ornek1
çalıştırılabilir1// Ornek1: Constructor'lar — varsayılan, parametreli, aşırı yükleme, this() zincirleme.
2// Çalıştırma: java Ornek1.java
3public class Ornek1 {
4
5 static class Urun {
6 String ad;
7 double fiyat;
8 int stok;
9
10 // 1) Parametresiz (no-arg) constructor — varsayılan değerlerle.
11 Urun() {
12 this("İsimsiz", 0.0, 0); // this(): BAŞKA bir constructor'ı çağır (zincirleme)
13 System.out.println(" no-arg constructor çalıştı");
14 }
15
16 // 2) Kısmi parametreli (overloading: aynı ad, farklı imza)
17 Urun(String ad, double fiyat) {
18 this(ad, fiyat, 0); // tam constructor'a delege et (kod tekrarını önler)
19 System.out.println(" 2-arg constructor çalıştı");
20 }
21
22 // 3) Tam parametreli — asıl başlatma burada (tek yerde).
23 Urun(String ad, double fiyat, int stok) {
24 this.ad = ad;
25 this.fiyat = fiyat;
26 this.stok = stok;
27 System.out.println(" 3-arg constructor çalıştı");
28 }
29
30 @Override public String toString() { return ad + " " + fiyat + "TL stok:" + stok; }
31 }
32
33 public static void main(String[] args) {
34 System.out.println("new Urun():");
35 System.out.println(" -> " + new Urun());
36
37 System.out.println("\nnew Urun(\"Klavye\", 450):");
38 System.out.println(" -> " + new Urun("Klavye", 450));
39
40 System.out.println("\nnew Urun(\"Mouse\", 250, 40):");
41 System.out.println(" -> " + new Urun("Mouse", 250, 40));
42
43 System.out.println("""
44
45 --- Constructor'lar ---
46 Constructor: nesne 'new' ile oluşturulurken çağrılan özel metot (dönüş tipi YOK, sınıf adıyla aynı).
47 Görevi: nesneyi GEÇERLİ bir başlangıç durumuna getirmek.
48 Hiç constructor yazmazsan derleyici boş bir VARSAYILAN constructor ekler (parametreli yazarsan EKLEMEZ).
49 Aşırı yükleme (overloading): farklı parametrelerle birden çok constructor.
50 this(...): aynı sınıftaki BAŞKA bir constructor'ı çağırır (zincirleme) -> başlatmayı TEK yerde topla, tekrarı önle.
51 (this(...) constructor'ın İLK satırı olmalı.)""");
52 }
53}Ornek2
çalıştırılabilir1// Ornek2: super() ile kalıtımda constructor zinciri ve kopya constructor.
2// Çalıştırma: java Ornek2.java
3public class Ornek2 {
4
5 static class Arac {
6 String marka;
7 Arac(String marka) {
8 this.marka = marka;
9 System.out.println(" Arac constructor: " + marka);
10 }
11 }
12
13 static class Otomobil extends Arac {
14 int kapiSayisi;
15
16 Otomobil(String marka, int kapiSayisi) {
17 super(marka); // ÜST sınıf constructor'ını çağır — İLK satır olmalı (yazmazsan super() örtük eklenir)
18 this.kapiSayisi = kapiSayisi;
19 System.out.println(" Otomobil constructor: " + kapiSayisi + " kapı");
20 }
21
22 // KOPYA constructor: var olan bir nesneden yeni (bağımsız) bir kopya üretir.
23 Otomobil(Otomobil digeri) {
24 this(digeri.marka, digeri.kapiSayisi); // alanları kopyala
25 System.out.println(" (kopya oluşturuldu)");
26 }
27
28 @Override public String toString() { return marka + " (" + kapiSayisi + " kapı)"; }
29 }
30
31 public static void main(String[] args) {
32 System.out.println("new Otomobil(\"Toyota\", 4):");
33 Otomobil o1 = new Otomobil("Toyota", 4);
34 System.out.println(" -> " + o1 + " (önce ÜST, sonra ALT constructor çalıştı)");
35
36 System.out.println("\nKopya constructor:");
37 Otomobil o2 = new Otomobil(o1);
38 o2.marka = "Toyota (kopya)";
39 System.out.println(" orijinal: " + o1);
40 System.out.println(" kopya : " + o2 + " (bağımsız nesne)");
41
42 System.out.println("""
43
44 --- super() ve kopya constructor ---
45 Kalıtımda nesne kurulurken ÖNCE üst sınıf constructor'ı çalışır (taban hazır olmalı).
46 super(...): üst sınıf constructor'ını çağırır; constructor'ın İLK satırı olmalı.
47 Yazmazsan derleyici parametresiz super()'i ÖRTÜK ekler (üstte no-arg yoksa HATA -> açıkça çağır).
48 Başlatma sırası: üst static -> alt static (bir kez) | üst alan/blok+constructor -> alt alan/blok+constructor.
49 Kopya constructor: var olan nesneden yeni BAĞIMSIZ kopya üretir (Cloneable'a göre genelde daha güvenli/açık).
50 NOT: record'larda compact/canonical constructor kullanılır (topic 62).""");
51 }
52}