Merhaba Arkadaslar,
Bu yazimda Java’da bulunan initialization(ilk kullanima hazirlama) blocks konusundan bahsedecegim. Java da 2 turlu initialization block vardir.
- static initialization block
- instance initialization block
Bir sinif yuklediginde ilk olarak ve sadece 1 kez static initialization block calisir.st
Instance olusturulda her defasinda instance initialization block calisir.
Basit bir ornek yapalim ;
public class InititialTest { static { System.out.println("Static Initialization Block"); } { System.out.println("Instance Initialization Block"); } public static void main(String[] args) { System.out.println("Main -1 "); InititialTest initial = new InititialTest(); InititialTest initial2 = new InititialTest(); } }
Bu ornekte ilk olarak ne calisir ? Main-1 den once static initialization block calisacaktir ! Daha sonrasinda 2 instance olusturdugumuz icin 2 defa instance initialization block calisacaktir. static initialization block ise sadece bir kez calisir.
Static Initialization Block Main -1 Instance Initialization Block Instance Initialization Block
Burada sorun yoksa eger isi bir adim daha karmasiklastiralim;
Peki birden fazla static initialization block veya instance initialization block ve yapilandirici varsa hangi sirada calisacaklar ?
public class InitializationTest2 { InitializationTest2() { System.out.println("Default Constructor"); } static { System.out.println("1 - Static Block"); } { System.out.println("1 - Instance Block"); } static { System.out.println("2 - Static Block"); } { System.out.println("2 - Instance Block"); } public static void main(String[] args) { System.out.println("Main - 1"); InitializationTest2 init = new InitializationTest2(); InitializationTest2 init2 = new InitializationTest2(); } }
Ciktimiz su sekilde olacaktir ;
1 - Static Block 2 - Static Block Main - 1 1 - Instance Block 2 - Instance Block Default Constructor 1 - Instance Block 2 - Instance Block Default Constructor
Ilk once static initialization block’lar calisacaktir. Dikkat ederseniz ilk olarak 1. static block calisacaktir. Sinif yuklendikten sonra main metodu calisacaktir. Daha sonrasinda 2 tane instance olusturmak istiyoruz. Dikkat ederseniz instance olustururken yapilandiricidan once instance initialization block’lar calisacaktir. Yine static initialization block’ta oldugu gibi ilk sirada olan block ilk olarak calisacaktir.
Block’larda tanimlayabilecegimiz degiskenlere dair bir kar ornek ;
public class InitializationTest3 { final static int var0; // final static int var5; //compiler error // final static degisken tanimladigin yerde ya da static blockta ilk deger // atanmasi yapilmalidir static int var7; static { int var1 = 20; // static int var2=30; //static degisken tanimlanamaz. final int var3 = 40; var0 = 40; var7 = 10; } { int var6 = 20; var7 = 30; } public static void main(String[] args) { System.out.println(var0); System.out.println(InitializationTest3.var0); // System.out.println(var1); //compile error // System.out.println(var3); /compile error // System.out.println(var6); //compile error } }
Buraya kadar her sey tamamsa olumcul vurusu yapalim isin icine kalitimi da katalim;
class A { { System.out.println("1.) A Instance Init Block"); } static { System.out.println("1.) A static init block"); } A() { System.out.println("A - No-Arg Constructor"); } { System.out.println("2.) A Instance Init Block"); } } class B extends A { B() { System.out.println("B - No-Arg Constructor"); } static { System.out.println("1.) B static init block"); } { System.out.println("1.) B Instance Init Block"); } } class C extends B { static { System.out.println("1.) C static init block"); } C() { this(10); System.out.println("C - No-Arg Constructor"); } { System.out.println("1.) C Instance Init Block"); } C(int c) { System.out.println(c); } { System.out.println("2.) C Instance Init Block"); } static { System.out.println("2.) C static init block"); } public static void main(String[] args) { System.out.println("1)C main method"); C c = new C(); System.out.println("2)C main method"); D d = new D(); D d2 = new D(); } } class D { static { System.out.println("1.) D static init block"); } { System.out.println("2.) D Instance Init Block"); } }
1.) A static init block 1.) B static init block 1.) C static init block 2.) C static init block 1)C main method 1.) A Instance Init Block 2.) A Instance Init Block A - No-Arg Constructor 1.) B Instance Init Block B - No-Arg Constructor 1.) C Instance Init Block 2.) C Instance Init Block 10 C - No-Arg Constructor 2)C main method 1.) D static init block 2.) D Instance Init Block 2.) D Instance Init Block
C sinifi B sinifini,B sinifi da A sinifini kalitmistir/extends.
Unutmayalim , static initialization block’lar bir kez ve sinif ilk yuklendiginde calisirlar. main metodunda “1)C main method” ciktisindan once C sinifinda bulunan static init block’lar calisacaktir! Bundan da once , C sinifi B sinifini , B sinifi A sinifini kalittigi icin once hiyerarsik olarak en tepedeki sinifin static init block’u calisacaktir. Burada unutulmamasi gereken bir diger nokta da bir sinif birden fazla static init block varsa daha once yazilmis olan static init block once calisacaktir!
1.) A static init block 1.) B static init block 1.) C static init block 2.) C static init block
Siniflarin yuklenme islemi tamamlandi sirada main metodunun calismasinda !
1)C main method
C turunden bir instance olusturdugumuzda sirasi ile su islemler gerceklesir ;
Hiyerarsinin tepesindeki A sinifina ait yapilandiricidan once instance initialization block calisacaktir.Daha sonrasinda A sinifina ait yapilandirici/constructor calisacaktir. Burada da static init block’ ta oldugu gibi instance init blockta da once yazilan block once calisacaktir. Daha sonrasinda A sinifinin yapilandiricisi calisacaktir.
1.) A Instance Init Block 2.) A Instance Init Block A - No-Arg Constructor
Ayni mantikla B sinifi da calisacaktir.
1.) B Instance Init Block B - No-Arg Constructor
C sinifinda da yine once instance initialization blocklar yazildigi sira ile calisacaktir, C sinifinin varsayilan/default yapilandiricinda this(10) ile diger yapilandirici cagrilmaktadir.
Dolayisiyla once 10 sonrasinda C – No-Arg Constructor yazilacaktir.
1.) C Instance Init Block 2.) C Instance Init Block 10 C - No-Arg Constructor
Daha sonrasinda main metodu devam edecektir ;
2)C main method calisacaktir.
Diger bir ornek olarak D sinifindan 2 tane instance olusturdugumuzda static initialization block 1 kez calisacaktir. Cunku D sinifi ilk olarak kullanildiginda yuklenecektir.
Fakat instance initialization block instance olusturuldugunda calisacaktir.
1.) D static init block 2.) D Instance Init Block 2.) D Instance Init Block