Constructor ve this — Nesne Nasıl Doğar?
Önce şunu oku: Sınıf, Nesne ve Kapsülleme — Kuralı Kim Koruyor?
30 saniyede özet
Constructor bir nesnenin doğum anıdır: alanları doldurur ve kuralı en baştan kontrol eder. this nesnenin kendisini gösterir; this(...) başka bir kurucuyu, super(...) ise üst sınıfın kurucusunu çağırır.
Bir bebek doğduğunda ona hemen bir ad ve bir kimlik numarası verilir. Adı olmayan bir bebekle hastaneden çıkılmaz.
Java’da nesneler de doğarken ihtiyaç duydukları bilgiyle doğar. Bu doğum anının adı constructor’dır.
Adım adım oku
- new Hesap("TR01", 100) çağrılınca bellekte yeni bir nesne için yer açılır.
- Alanlar önce varsayılan değerlerle başlar: iban null, bakiye 0.
- Constructor çalışır ve alanları gerçek değerlerle doldurur.
- Kural kontrol edildikten sonra nesne hazırdır ve çağırana teslim edilir.
-
Bayt: Hesap nesnesi oluşturdum ama IBAN'ı boş kalmış! Sonra her yerde null hatası.
-
Sen: IBAN'ı nerede veriyordun?
-
Bayt: Sonra bir setter ile... ama çağırmayı unutmuşum.
-
Bayt: O zaman IBAN'ı doğum anında isteyelim. IBAN'sız hesap hiç doğmasın.
Constructor: nesnenin doğum anı
Bir constructorBir nesne new ile oluşturulurken bir kez çalışan, sınıfla aynı adı taşıyan ve dönüş tipi olmayan özel metot. Alanları doldurur ve kuralı en baştan kontrol eder.Türkçede kurucu metot da denir. this(...) aynı sınıftaki başka bir kurucuyu, super(...) üst sınıfın kurucusunu çağırır; ikisi de kurucunun ilk satırında olmalıdır.Sözlükte gör →, sınıfla aynı adı taşıyan ve dönüş tipi olmayan özel bir metottur. new her çalıştığında bir kez çağrılır ve nesnenin alanlarını doldurur.
public class Hesap { private final String iban; private BigDecimal bakiye;
public Hesap(String iban, BigDecimal acilisBakiyesi) { if (iban == null || iban.isBlank()) { throw new IllegalArgumentException("IBAN zorunlu"); } this.iban = iban; this.bakiye = acilisBakiyesi; }}Kuralı burada kontrol edersen geçersiz bir hesap hiç doğmaz. Sonradan setter ile doldurmak ise “doldurmayı unutma” riskini her kullanıcıya bırakır.
Kafam karıştı, daha basit anlat
Constructor, nesne doğarken çalışan ilk ve tek kapıdır. Zorunlu bilgileri burada iste, kuralı burada kontrol et; o zaman eksik bir nesne hiç oluşmaz.
Bir hesabın IBAN'ı olmadan hiç var olmamasını istiyorsun. Bu kuralı en sağlam nereye koyarsın?
Varsayılan constructor nereye gitti?
Hesap sınıfına yalnızca `Hesap(String iban)` kurucusunu ekledin. Başka bir dosyadaki `new Hesap()` satırı derlenir mi? Cevabı göster
Derlenmez. Java parametresiz bir kurucuyu yalnızca sen hiç kurucu yazmadıysan kendiliğinden ekler. Kendi kurucunu yazdığın an o hazır kurucu kaybolur.
Hiç kurucu yazmazsan Java senin yerine parametresiz, boş bir varsayılan kurucuSınıfta hiç kurucu yazılmadığında Java'nın kendiliğinden eklediği parametresiz, boş kurucu.Tek bir kurucu yazıldığı an eklenmez. JPA gibi bazı kütüphaneler parametresiz bir kurucu istediği için o durumda bilerek, genellikle protected olarak yazılır.Sözlükte gör → ekler. Tek bir kurucu yazdığın anda bu hediye geri alınır.
Bu çoğu zaman iyidir: “IBAN’sız hesap olmasın” dediysen, parametresiz bir kurucunun ortalıkta durmaması tam istediğin şeydir. Bazı kütüphaneler (JPA gibi) yine de parametresiz bir kurucu ister; o zaman onu bilerek ve protected olarak eklersin.
Kafam karıştı, daha basit anlat
Kapıyı sen yapmadıysan Java boş bir kapı koyar. Kendi kapını yaptığın an o boş kapı sökülür; yalnızca senin kapından girilir.
Hesap sınıfında hiç kurucu yoktu ve her yerde `new Hesap()` kullanılıyordu. Sınıfa `Hesap(String iban)` eklendi. Ne olur?
Program ne yazdırır?
Satır satır: this ve kurucu zinciri
Parametrenin adı alanın adıyla aynıysa hangisi hangisi? this, “bu nesnenin kendisi” demektir ve karışıklığı çözer.
this, alanı parametreden ayırır
public Hesap(String iban, BigDecimal bakiye) { this.iban = iban; this.bakiye = bakiye;} public Hesap(String iban) { this(iban, BigDecimal.ZERO);}Debug
this.iban Soldaki this.iban nesnenin alanı, sağdaki iban ise parametre. this olmasa ikisi de parametre olurdu.
- this.iban
- = "TR01"
Sol/sağ ok tuşlarıyla da gezebilirsin.
Her yeni müşterinin adı null çıkıyor. Hatalı satır hangisi?
Kalıtımda doğum sırası
Bir alt sınıfın nesnesi doğarken önce üst sınıf kısmı kurulur. Alt sınıf kurucusunun ilk işi super(...) ile üst sınıfın kurucusunu çağırmaktır; sen yazmazsan Java parametresiz super() çağrısını kendisi ekler.
class Hesap { Hesap(String iban) { System.out.println("Hesap"); }}
class VadeliHesap extends Hesap { VadeliHesap(String iban) { super(iban); // önce üst sınıf System.out.println("VadeliHesap"); // sonra kendisi }}// new VadeliHesap("TR01") → Hesap, sonra VadeliHesapÜst sınıfın parametresiz kurucusu yoksa, alt sınıf super(...)’ı doğru argümanlarla açıkça çağırmak zorundadır; yoksa derlenmez.
Kafam karıştı, daha basit anlat
Bir binada önce temel atılır, sonra katlar çıkılır. Alt sınıfın kurucusu da önce üst sınıfınkini çalıştırır, sonra kendi işini yapar.
Bir nesne hangi sırayla doğar?
Tohum 424501new VadeliHesap("TR01")
Oynat ya da adımla: her adımda doğumun bir anı.
Şu an ne oldu?
new VadeliHesap("TR01")
Önce üst sınıf, sonra alt sınıf. Arada neler olabilir?
Görevler0/3
vade alanını doğmadan önce okuaçık
İpucu
Varsayılan ayarlar yeter.
Kurucu çalıştığı hâlde iban null kalsınaçık
İpucu
Hangisi alan, hangisi parametre?
Hiçbir tuzak olmadan nesneyi doğuraçık
İpucu
Üç anahtarı da kapat.
Olay günlüğü (0)
Henüz olay yok. Oynat veya adımla.
- Varsayılanla oynat. Hesap kurucusu ezilen tanit() metodunu çağırdı; vade henüz 12 olmadığı için “vade: 0” yazıldı.
- “this yazılmadı”yı aç. Kurucu çalıştı, ama iban null kaldı.
- “super(iban) çağırmıyor”u aç. Sınıf hiç derlenmedi.
- Üç anahtarı da kapat. Nesne temiz doğdu: önce Hesap, sonra VadeliHesap.
Program ne yazdırır?
Bir bankada bu fikir, hesap açılışının kurallarını tek bir kapıda toplamak demektir: kimlik, para birimi ve açılış tutarı doğum anında kontrol edilir.
Derinleş · Hesap açılışı: kural doğum anında 3 dosya · ~45 satır · ilk okumada atlayabilirsin
Tuzaklar
this. yazmayı unutmak. iban = iban; satırı parametreyi kendisine atar; alan boş kalır. Alan final ise derleyici atanmadığı için hata verir; değilse alan sessizce null kalır.
Kurucudan ezilebilir bir metot çağırmak. Alt sınıfın alanları henüz dolmadan onun metodu çalışır. Kurucudan yalnızca private ya da final metotlar çağır.
Uzayan parametre listesi. Yedi parametreli bir kurucuda hangi değerin ne olduğu kaybolur. Böyle bir durumda builder ya da adı olan bir fabrika metodu daha okunur olur.
Üst sınıf yalnızca `Hesap(String iban)` kurucusuna sahip. Alt sınıf `VadeliHesap()` kurucusunda super çağrısı yazmıyor. Ne olur?
Kendini sına
Constructor'ın bir dönüş tipi vardır.
Aynı sınıfta iki kurucu var. Kuralları tek bir yerde tutmanın yolu hangisi?
Aklında kalacak üç şey
- 1 Constructor nesnenin doğum anıdır; kuralı burada kontrol edersen geçersiz bir nesne hiç doğmaz.
- 2 Kendi kurucunu yazdığın an Java'nın parametresiz varsayılan kurucusu kaybolur.
- 3 this nesnenin kendisini gösterir; this(...) aynı sınıftaki başka bir kurucuyu, super(...) üst sınıfın kurucusunu çağırır ve üst sınıf her zaman önce kurulur.
3 kart sonraki derste seni bekliyor