Eğitim Portalı/Java/Constructor'lar (Yapıcılar)
Java01-java/93-constructorlar

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 (void bile değil) — onu metottan ayıran budur.
  • new ile 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ça super(...) ç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ı):

  1. (İlk kez) üst → alt static alanlar + static bloklar (bir kez).
  2. Üst sınıf: alan başlatmaları + instance bloklar → üst constructor gövdesi.
  3. 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ı final yapı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ılabilir
Ornek1.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.

Ornek2

çalıştırılabilir
Ornek2.java
1// 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}
Çıktı yerel JDK 21 ile yakalandı — tarayıcıda JVM çalışmaz.