Merhaba Arkadaslar,
Bu yazimda Java’da constructor/ yapilandirici kavramindan bahsedecegim.
Javada , yeni bir obje olusturuldugunda constructor/yapilandirici calistirilir/invoke , sinifin kendi yapilandiricisinin yaninda superclass’in yapilandiricisi da calisir detaylar biraz asagida olacak.
Peki yapilandirici ne zaman calisacaktir ? new anahtar kelimesini kullandigimizda yapilandirici calisacaktir. Bir de serilestirme yapisinda calismaktadir fakat bu konuya bir hayli ilerde gelecegiz. Biz basit temeller ile baslayalim ;
Basit Temeller
- Abstract/soyut siniflar dahil tum siniflarin yapilandiricisi/constructor olmak zorundadir.
- Yapilandiri/constructor olmasi zorunlulugu tanimlanmak zorunda oldugu anlamina gemez.
- Eger bir sinif icin yapilandirici/constructor tanimlamazsak otomatik olarak varsayilan yapilandirici gizli olarak tanimlanir.
- Varsayilan yapilandirici herhangi bir parametre almaz. Varsayilan yapilandiriciyi biz kendimiz de tanimlayabiliriz.
class A { // A(){} A sinifina ait varsayilan yapilandirici }
- Eger kendimiz bir yapilandirici tanimlarsak , varsayilan yapilandirici otomatik olarak tanimlanmaz.
public class A { int x; int y; public A(int x, int y) { this.x = x; this.y = y; } public static void main(String[] args) { A a = new A(10,20); //A a2 = new A(); derleme hatasi } }
Yukaridaki basit ornekte varsayilan yapilandici ile bir A objesi olusturulmak istenmektedir buna ragmen derleme hatasi olmaktadir, cunku ilgili yapilandirici mevcut degildir. Bunun nedeni biz kendimiz bir yapilandirici tanimladigimiz icin varsayilan yapilandirici otomatik olarak olusmaz.
Derleme hatasini cozmek icin varsayilan yapilandiriciyi da tanimlamamiz gerekmektedir.
Yapilandirici Zincir Yapisi / Constructor Chaining
Horse h = new Horse(); ornegini inceleyelim , burada Horse sinifinin Animal sinini kalittigini varsayalim. Su adimlar gerceklesecektir ;
- Horse sinifinin yapilandiricisi cagrilacaktir. Her yapilandirici , ait oldugu sinifin superclass’ina ait yapilandiriciyi gizli/implicit olarak cagirir. super() yapisi burada devreye girer. Her yapilandiricinin basinda (yani genel olarak) super() cagrisimi bulunmaktadir. Farkli durumlari sonraki yazilarda incelecegiz.
- Animal sinifina ait yapilandirici cagrilir.
- Object sinifina ait yapilandirici cagrilir, cunku Object sinifi tum siniflarin superclass’idir. Animal sinifi Object sinifini gizli/implicit olarak kalitmaktadir.
- Stack/yigin mantiginda olan bu yapida Object sinifinin yapilandirici tamamlanir sonrasinda Animal sinifinin yapilandirici ve en son olarak da Horse sinifi yapilandirici sonlanir.
ornegi inceleyelim;
class B { int t; public B(int t) { super(); this.t = t; } } public class A extends B{ int x; int y; public A(int x, int y) { //derleme hatasi this.x = x; this.y = y; } public static void main(String[] args) { A a = new A(10,20); //A a2 = new A(); } }
A sinifi , B sinifini kalitmaktadir, A sinifina ait yapilandiricida hata meydana gelmektedir. Peki neden ? Cunku bu yapilandiricinin basinda gizli olarak super(); anahtar kelimesi vardir ve B sifinina ait yapilandiriciyi cagirmaktadir. Fakat biz int bir parametre alan yapilandirici tanimladigimiz icin parametresiz olan varsayilan yapilandirici tanimlanmadigindan derleme hatasi aliriz. B sinifina varsayilan yapilandiriciyi eklemek sorunu cozecektir.
Yapilandirici ile ilgili ilk yazimda isin en kolay temel ornekleri uzerinde durmaya calistim. Sonraki yazilarimda en ince detayina kadar incelemeye devam edecegiz.
Buddy
I will be putting this dalinzzg insight to good use in no time.