Nesne Yönelimli Programlama (OOP) dillerinden biri olan Java’yı öğrenirken, sınıflardan (class) nesneler (object) üretmenin temeline inmeniz gerekir. Bir sınıfı tasarladıktan sonra onu bellekte canlı ve fiziksel bir varlık (nesne) haline getirmek için new anahtar kelimesini kullanırız,. Peki ama new Kutu(); dediğimizde bu ifadenin sonundaki parantezler () ne anlama geliyor? İşte bu parantezler, Java’nın en önemli yapılarından biri olan Constructor (Kurucu / Yapıcı Metot) çağrısını temsil eder,,.
Bu rehberimizde, ilk defa öğrenecek biri için anlaşılır bir dille Java’da Constructor kavramını, neden kullanıldığını ve türlerini örneklerle adım adım inceleyeceğiz.
1. Constructor (Yapıcı Metot) Nedir?
Constructor (Kurucu), bir nesne oluşturulduğu anda Java tarafından ilk olarak ve yalnızca bir defa otomatik olarak çalıştırılan özel bir metottur,. Görevi, yeni yaratılan nesnenin içindeki değişkenlere (niteliklere) ilk değerlerini atamak ve nesneyi kullanıma hazır hale getirmektir.
Bir yapıcı metodun sıradan yöntemlerden (metotlardan) ayrılan çok kesin iki temel kuralı vardır:
- Sınıf ile Tamamen Aynı İsimde Olmalıdır: Metodun adı, içinde bulunduğu sınıfın adıyla birebir aynı olmak zorundadır,.
- Geri Dönüş Tipi Yoktur: Sıradan metotlar
int,Stringya davoidgibi geri dönüş tiplerine sahipken, Constructor’ların geri dönüş tipi alanı (void bile) yoktur,. Kurucunun örtük (gizli) dönüş tipi, ait olduğu sınıfın ta kendisidir.
2. Neden Constructor Kullanırız? (Amacı Nedir?)
Bir nesnenin durumunun (içindeki değişkenlerin değerlerinin) programın her anında anlamlı ve tutarlı olması gerekir. Eğer bir “Zaman” nesnesi yaratıyorsak, saatin -5 ya da dakikanın 90 olması anlamsızdır. Aynı şekilde, nesne bellekte ilk oluştuğu anda da anlamsız olmamalıdır.
Eğer biz nesnenin ilk durumunu belirlemezsek, örneğin saat, dakika ve saniye değerleri varsayılan olarak 0 değerini alacaktır,. Amacımız, nesne oluşturulurken ona başlangıç değerlerini vermek ve nesnenin ilk durumunu “anlamlı” kılmaktır.
3. Java’da Constructor Türleri
Java’da temel olarak karşılaşacağınız üç farklı kurucu durumu vardır:
A) Varsayılan (Default) Constructor
Siz bir sınıf yazdığınızda içine hiçbir kurucu metot eklemezseniz bile Java arka planda sizin için boş ve parametre almayan bir “Varsayılan Kurucu” (Default Constructor) üretir,,.
Bu varsayılan kurucu, nesneyi bellekte yaratır ve sayısal değişkenlere 0, mantıksal (boolean) değişkenlere false, referans tiplerine (örneğin String) ise null varsayılan değerini atar,.
public class Kutu {
double genislik;
double yukseklik;
double derinlik;
// Biz yazmasak da Java arka planda şöyle bir kurucu çalıştırır:
// Kutu() { }
}
Eğer sınıfın içine kendi kurucunuzu yazarsanız, Java artık varsayılan kurucuyu otomatik olarak üretmez,.
B) Parametreli (Parameterized) Constructor
Sınıfımızdan nesne üretirken başlangıç değerlerini dinamik olarak dışarıdan vermek isteyebiliriz. Bunun için yapıcı metoda parametreler ekleriz,.
public class Zaman {
int saat;
int dakika;
int saniye;
// Parametreli Constructor
Zaman(int st, int dk, int sn) {
saat = st;
dakika = dk;
saniye = sn;
}
}
Artık bu sınıftan bir nesne üretmek istediğimizde değerleri anında verebiliriz: Zaman zamanNesnesi = new Zaman(14, 30, 0);,.
4. this Anahtar Kelimesinin Kullanımı
Yukarıdaki örnekte kurucu metodun parametrelerine st, dk, sn gibi farklı isimler verdik. Ancak kodun daha okunaklı olması için parametre isimlerini sınıfın nitelik isimleriyle aynı yapmak isteyebiliriz (örneğin parametreye de saat demek). Bu durumda, sınıfın içindeki değişken ile dışarıdan gelen parametre ismi çakışır,.
Bu isim çakışmasını çözmek (namespace collision) ve derleyiciye “Bu sınıfın kendi değişkenine, dışarıdan gelen parametreyi ata” diyebilmek için this anahtar kelimesi kullanılır,,. this, her zaman o an üzerinde çalışılan mevcut nesneye bir referanstır,.
public class Zaman {
int saat;
int dakika;
Zaman(int saat, int dakika) {
this.saat = saat; // this.saat nesnenin niteliğidir, saat ise parametredir.
this.dakika = dakika;
}
}
5. Constructor Aşırı Yükleme (Constructor Overloading)
Java, tıpkı standart metotlarda olduğu gibi, yapıcı metotların da aşırı yüklenmesine (overloading) izin verir,. Bir sınıfın içinde aynı isimde fakat parametre sayıları veya tipleri farklı olan birden fazla Constructor yazabilirsiniz,,.
Bu özellik, gerçek dünyada projeler geliştirirken kuraldan ziyade bir zorunluluk haline gelir. Örneğin bir kutuyu sadece tek bir boyut vererek (küp gibi) yaratmak veya hiçbir boyut vermeden (varsayılan değerlerle) yaratmak isteyebilirsiniz,,.
public class Kutu {
double genislik, yukseklik, derinlik;
// 1. Kurucu: Tüm boyutlar veriliyor
Kutu(double w, double h, double d) {
genislik = w; yukseklik = h; derinlik = d;
}
// 2. Kurucu: Boyut verilmediğinde varsayılan (-1) atama
Kutu() {
genislik = -1; yukseklik = -1; derinlik = -1;
}
// 3. Kurucu: Küp oluşturulurken tek parametre
Kutu(double uzunluk) {
genislik = yukseklik = derinlik = uzunluk;
}
}
Artık new Kutu(), new Kutu(5) veya new Kutu(10, 20, 15) yazarak ihtiyacınıza göre farklı kurucuların tetiklenmesini sağlayabilirsiniz,.
6. Kurucuların Birbirini Çağırması: this()
Constructor aşırı yüklemesi yaparken kodların tekrar ettiğini (code duplication) fark edebilirsiniz,. Aynı ilk atama işlemlerini her kurucuda tekrar yazmak yerine, bir kurucunun içinden başka bir kurucuyu çağırabilirsiniz. Java’da bu işlem this() anahtar ifadesiyle yapılır,.
Önemli Kural: this() ile bir başka kurucuyu çağırıyorsanız, bu ifade kurucunun içindeki ilk çalıştırılabilir kod satırı olmak zorundadır,. Aksi takdirde derleme hatası alırsınız.
class Zaman {
int saat, dakika, saniye;
Zaman(int saat, int dakika, int saniye) {
this.saat = saat;
this.dakika = dakika;
this.saniye = saniye;
}
Zaman(int saat) {
this(saat, 0, 0); // 3 parametreli Ana Constructor'ı çağırır!
}
}
7. Kalıtım (Inheritance) Sisteminde Constructor ve super() Kullanımı
İleri düzey Java öğrenirken sınıfların birbirinden miras aldığını (Inheritance) göreceksiniz. Ancak bilmeniz gereken en temel kural şudur: Constructor’lar kalıtım yoluyla alt sınıfa (subclass) aktarılmaz (miras alınmazlar). Alt sınıfın, kendi kurucusunu kendisi tanımlaması gerekir.
Nesne yaratılırken, iç içe geçen yapı gereği önce daima “Ata Sınıfın” (Superclass) kurucusu çalıştırılır,. Alt sınıf, atasına ait kurucuyu çağırmak için super() anahtar kelimesini kullanır. Eğer siz kodu yazarken super() ifadesini kullanmazsanız, Java derleyicisi sizin yerinize otomatik olarak parametresiz (default) bir super(); çağrısı ekler,. Tıpkı this() gibi, super() çağrısı da bir kurucunun daima ilk satırı olmak zorundadır,.
Özetle; Java’da yapıcı metotlar (Constructor’lar), sınıfların hayat bulduğu fabrikalardır. Doğru yapılandırılmış kurucular sayesinde daha temiz, hatalardan arındırılmış (örneğin NullPointerException riskini azaltan) ve nesnelerin her zaman sağlıklı ve “anlamlı” verilerle doğmasını sağlayan kodlar yazabilirsiniz. Yeni başladığınız bu süreçte bol bol parametreli kurucular tanımlayarak denemeler yapmanız, konuyu tamamen kavramanıza yardımcı olacaktır.





