İçeriğe geç

Constructor ve this — Nesne Nasıl Doğar?

Başlangıç 8 dk Çok sık karşılaşılır

Ö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.

new yer açar, constructor alanları doldurur ve nesne ancak hazır olunca teslim edilir.
Adım adım oku
  1. new Hesap("TR01", 100) çağrılınca bellekte yeni bir nesne için yer açılır.
  2. Alanlar önce varsayılan değerlerle başlar: iban null, bakiye 0.
  3. Constructor çalışır ve alanları gerçek değerlerle doldurur.
  4. Kural kontrol edildikten sonra nesne hazırdır ve çağırana teslim edilir.
  1. Bayt: Hesap nesnesi oluşturdum ama IBAN'ı boş kalmış! Sonra her yerde null hatası.

  2. Sen: IBAN'ı nerede veriyordun?

  3. Bayt: Sonra bir setter ile... ama çağırmayı unutmuşum.

  4. 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.

Kuralı doğum anında kontrol et
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.

Hızlı kontrolBaşlangıç

Bir hesabın IBAN'ı olmadan hiç var olmamasını istiyorsun. Bu kuralı en sağlam nereye koyarsın?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

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.

Hızlı kontrolBaşlangıç

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?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Program ne yazdırır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
Varsayilan.java
1class Musteri {
2 String ad;
3 int puan;
4 boolean aktif;
5}
6
7Musteri m = new Musteri();
8System.out.println(m.ad + " " + m.puan + " " + m.aktif);
Java 21UTF-8LF

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

Hesap.java
1public Hesap(String iban, BigDecimal bakiye) {
şu an çalışan satır this.iban = iban;
3 this.bakiye = bakiye;
4}
5
6public Hesap(String iban) {
7 this(iban, BigDecimal.ZERO);
8}

Debug

Adım 1/3

this.iban Soldaki this.iban nesnenin alanı, sağdaki iban ise parametre. this olmasa ikisi de parametre olurdu.

this.iban
= "TR01"
Java 21UTF-8LF2:1

Sol/sağ ok tuşlarıyla da gezebilirsin.

Hızlı kontrolBaşlangıç

Her yeni müşterinin adı null çıkıyor. Hatalı satır hangisi?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Hatalı satıra dokun, sonra kontrol et.

Musteri.java
Java 21UTF-8LF

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.

Önce temel, sonra kat
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 424501

new VadeliHesap("TR01")

    Oynat ya da adımla: her adımda doğumun bir anı.

    Hız
    Adım 0

    Ş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.

    1. Varsayılanla oynat. Hesap kurucusu ezilen tanit() metodunu çağırdı; vade henüz 12 olmadığı için “vade: 0” yazıldı.
    2. “this yazılmadı”yı aç. Kurucu çalıştı, ama iban null kaldı.
    3. “super(iban) çağırmıyor”u aç. Sınıf hiç derlenmedi.
    4. Üç anahtarı da kapat. Nesne temiz doğdu: önce Hesap, sonra VadeliHesap.
    Hızlı kontrolBaşlangıç

    Program ne yazdırır?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
    Sira.java
    1class Hesap {
    2 Hesap() { System.out.print("A "); }
    3}
    4
    5class VadeliHesap extends Hesap {
    6 VadeliHesap() { System.out.print("B "); }
    7}
    8
    9new VadeliHesap();
    Java 21UTF-8LF

    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
    Proje dosyaları

    src/main/java/com/bank/account/ Account.java Asıl kurucu bütün kuralları kontrol eder; kısa kurucu ona zincirlenir.

    src/main/java/com/bank/account/Account.java
    public class Account {
    private final String iban;
    private final String currency;
    private BigDecimal balance;
    public Account(String iban, String currency, BigDecimal openingBalance) {
    if (iban == null || !iban.startsWith("TR")) {
    throw new IllegalArgumentException("A Turkish IBAN is required");
    }
    if (openingBalance.signum() < 0) {
    throw new IllegalArgumentException("Opening balance cannot be negative");
    }
    this.iban = iban;
    this.currency = currency;
    this.balance = openingBalance;
    }
    // A new TRY account starts empty; the rules still live in one place.
    public Account(String iban) {
    this(iban, "TRY", BigDecimal.ZERO);
    }
    public String iban() {
    return iban;
    }
    }

    src/main/java/com/bank/account/ TimeDepositAccount.java Vadeli hesap önce üst sınıfı kurar, sonra kendi kuralını ekler.

    src/main/java/com/bank/account/TimeDepositAccount.java
    public class TimeDepositAccount extends Account {
    private final LocalDate maturesOn;
    public TimeDepositAccount(String iban, BigDecimal principal, LocalDate maturesOn) {
    super(iban, "TRY", principal); // the parent's rules run first
    if (!maturesOn.isAfter(LocalDate.now())) {
    throw new IllegalArgumentException("Maturity must be in the future");
    }
    this.maturesOn = maturesOn;
    }
    }

    src/main/java/com/bank/ Main.java Kullanım ve çıktı yorumlarda.

    src/main/java/com/bank/Main.java
    public class Main {
    public static void main(String[] args) {
    System.out.println(new Account("TR01").iban()); // TR01
    new Account("DE01"); // IllegalArgumentException: A Turkish IBAN is required
    }
    }

    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.

    Hızlı kontrolOrta

    Ü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?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Kendini sına

    Şimşek turu1/4

    Constructor'ın bir dönüş tipi vardır.

    Soru 1/3Başlangıç

    Aynı sınıfta iki kurucu var. Kuralları tek bir yerde tutmanın yolu hangisi?

    Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

    Aklında kalacak üç şey

    1. 1 Constructor nesnenin doğum anıdır; kuralı burada kontrol edersen geçersiz bir nesne hiç doğmaz.
    2. 2 Kendi kurucunu yazdığın an Java'nın parametresiz varsayılan kurucusu kaybolur.
    3. 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.
    Sonraki kapı Sınıftaki alanı private yaptın ama equals metodu başka bir nesnenin private alanını okuyabiliyor. Gizlilik bu mu? Erişim Belirleyiciler — Kim Hangi Kapıdan Girer? · 8 dk

    3 kart sonraki derste seni bekliyor

    0/3 kart bu dersten toplandı