Yapıcılar Neden Vardır
Önceki sayfada sınıflar oluşturup new ile nesneler ürettiniz. Yapıcı, o new çağrısı sırasında gerçekten çalışan koddur. Tek amacı, kullanıma hazır bir nesneyi geri vermektir: tüm zorunlu alanları ayarlanmış, yarı başlatılmış hiçbir durumu kalmamış bir nesne.
Bir yapıcı metoda benzer, ancak iki farkı vardır: sınıfla aynı ada sahiptir ve dönüş tipi yoktur, void bile değil.
new Point(3, 4) nesneyi tahsis eder ve ardından yapıcının gövdesini x = 3 ve y = 4 ile çalıştırır. new döndüğünde p tamamen başlatılmış olur.
this Anahtar Kelimesi
Yukarıdaki yapıcıda parametreler x ve y olarak adlandırılmıştır; alanlarla aynı. this.x "bu nesneye ait x alanı" anlamına gelirken, yalın x parametreye atıfta bulunur. this olmadan, x = x ifadesi yalnızca parametreyi kendisine atar ve alanı el değmeden bırakır.
this'e yalnızca bir parametre bir alanı gölgelediğinde ihtiyacınız vardır, ama birçok kişi netlik için onu her yerde kullanır. Sık yapılan hata, adlar çakıştığında onu unutmaktır: kod derlenir, çalışır ve alanlarınızı sessizce varsayılan değerlerinde (null, 0, false) bırakır.
Varsayılan Yapıcı
Hiç yapıcı yazmazsanız, Java sessizce bir varsayılan yapıcı sağlar: fazladan hiçbir şey yapmayan, argümansız, public bir yapıcı. İşte bu yüzden hiç yapıcısı olmayan sınıflarda new çalışıyordu.
İşin püf noktası: herhangi bir yapıcı yazdığınız anda ücretsiz olanı kaybolur.
class Box {
int size;
Box(int size) { // artık argümansız yapıcı YOK
this.size = size;
}
}
new Box(); // derleme hatası: Box() yapıcısı yok
new Box() ifadesinin yine de çalışmasını istiyorsanız, argümansız yapıcıyı kendiniz bildirin:
Yapıcı Aşırı Yükleme
Bir sınıf, parametre listeleri farklı olduğu sürece birden fazla yapıcıya sahip olabilir; bu, metot aşırı yüklemenin yapıcılara uygulanmış halidir. Her biri nesneyi oluşturmanın farklı bir yolunu sunar.
Java, new'e geçirdiğiniz argümanların sayısına ve tiplerine göre eşleşen yapıcıyı seçer.
this() ile Zincirleme
Yukarıdaki tekrarı fark edin: her yapıcı alanları kendisi atıyor. Bir yapıcının this(...) ile başka bir yapıcıyı çağırmasını sağlayarak bundan kaçınabilirsiniz. Çağrı, yapıcının ilk ifadesi olmalıdır.
Artık asıl başlatma tek bir yerde yaşıyor. Daha küçük yapıcılar yalnızca varsayılan değerleri doldurup işi iletir. Eğer this(...) çağrısından önce bir ifade koymaya kalkarsanız, derleyici bunu reddeder.
Yapıcılar ve super()
Her yapıcı önce örtük olarak üst sınıfının yapıcısını çağırır. Hiçbir şey yazmazsanız, Java gövdenin en üstüne gizli bir super() (üst sınıfın argümansız yapıcısı) ekler. Alt sınıf oluşturmaya başladığınızda bununla doğrudan çalışacaksınız; bu da bir sonraki konu.
class Animal {
String name;
Animal(String name) { this.name = name; }
}
class Dog extends Animal {
Dog(String name) {
super(name); // ebeveyn yapıcısını burada açıkça çağırmak gerekir
}
}
Animal'ın argümansız bir yapıcısı olmadığından, Dog super(name) çağrısını açıkça yapmak zorundadır; başvurulacak ücretsiz bir super() yoktur. Tıpkı this() gibi, bir super(...) çağrısı da yapıcının ilk ifadesi olmak zorundadır.
Sıradaki: Kalıtım
Yapıcılar tek bir nesneyi başlatır, ama super() zaten daha büyük bir şeyin ipucunu verdi: sınıflar diğer sınıfların üzerine inşa edilebilir; onların alanlarını, metotlarını ve yapıcılarını yeniden kullanabilir. Bu ilişki, bir sınıfın bir diğerini genişletmesi, kalıtımdır ve bir sonraki sayfanın konusudur.
Sıkça Sorulan Sorular
Java'da yapıcı metot (constructor) nedir?
Yapıcı metot, new ile bir nesne oluşturduğunuzda çalışan özel bir metottur. Sınıfla aynı ada sahiptir ve dönüş tipi yoktur (void bile değil). Görevi, yeni nesneyi geçerli bir başlangıç durumuna getirmektir; bu genellikle yapıcının argümanlarını nesnenin alanlarına atayarak yapılır.
Java'da yapıcı metot ile sıradan bir metot arasındaki fark nedir?
Yapıcı metot sınıfla tam olarak aynı ada sahiptir, hiçbir dönüş tipi bildirmez ve yalnızca bir nesne oluşturulurken new ile çağrılabilir. Sıradan bir metodun kendi adı vardır, bir dönüş tipi (veya void) bildirir ve mevcut bir nesne üzerinde çağrılır. Yapıcılar başlatır; metotlar ise sonrasında işi yapar.
Java'da hiç yapıcı metot yazmazsam ne olur?
Derleyici size ücretsiz bir varsayılan yapıcı verir; bu yapıcı hiç parametre almaz ve örtük super() çağrısı dışında hiçbir şey yapmaz. Ancak kendiniz herhangi bir yapıcı yazdığınız anda bu ücretsiz yapıcı kaybolur; dolayısıyla parametreli bir yapıcı ekler ve hâlâ new Thing() ifadesinin çalışmasını isterseniz, argümansız yapıcıyı açıkça bildirmeniz gerekir.