Monday, September 20, 2010

Initialization Blocks(Class'ta Bloglarin Calisma Prensibi )

Bu yazimda bir class icinde bloglar hangi siraya gore calistigi hakinda bir ugulama ile anlatmaya calisacam. Ama uygulamaya gecmeden sunlar demek istiyorum blog kavrami biraz genitir yani blog deyince akliniza hemen method gelmesi mesele bir kac blog cesidi yazayim
  • public class TestBlockClass{}  
  • public void testBlockMethod (){}
  • public  TestBlockClass(){}
  • static {} 
  • {} 
Gorduyunuz gibi bir class'in icinde bulunan bloglardan bir kactaneyi siraldim ben bugun constructor , static blog ve sadece blog olan bloglari inceliyecem.

class Init {

         static { 

               System.out.println("1 static init"); 
          }

         static { 

                  System.out.println("2 static init");
         }

         { 

                   System.out.println("1 instance init");
          }

         {

                   System.out.println("2 instance init"); 
          }

         Init() {
                 System.out.println("1 constructor init");
         }

         Init(int x) {
                 System.out.println("2 constructor init");
         }

         Init(int x , int y) {
                 System.out.println("3 constructor init");
         }

}


public class InitMain {
      public static void main(String[] args) {
          Init i = new Init();

      }
}

 

//Console  Output
1 static init
2 static init
1 instance init
2 instance init
1 constructor init


Aslinda su olay gerceklesir bir sinif ilk cagirildigida once sinifa remde bir yer ayriliyor ve bu yere ayni zamanda static olan tum nesneler , methodlar , bloglar yukleniyor ve yuklenmesi demek bir kere calismasi demekoluyor ama her  Init class'mizi cagirdik ve remde yer olusturdu ondan sonra her Init icin olusturulan referansta tabiki program sonlanmadigi surece remde yer olusturmaz cunku artik vardir. Sadece Init ile ilgili olusturulan her referansta normal bloglar her seferinde yenide calistirilir


public class InitMain {
      public static void main(String[] args) {
          Init i = new Init();

          Init i1 = new Init(22);
      }
}



//Console  Output
1 static init
2 static init
1 instance init
2 instance init
1 constructor init

 
1 instance init
2 instance init
2 constructor init


Yukardaki yazdigim aciklama biraz karisik gibi gelsede ikinci olusturdugum InitMain ile hersey daha iyi anlasilir. Goruldiyi gibi TestMain calistirdigimizda ilk once Init class remde yer ayrilip olusuyor ve onunla beraber static bloglarimizda olusyor yani calisiyor ve referans olusturdugun icin normal bloglarimda bir kere calistir ve tabiki cagirilan constructor calisir. ama ikinsi satirda tekrar Init'in referansi olustururken sadece bloglar calisir ve constructor calisir yani static bloglar tekrar calismaz. 
 

 public class InitMain {
      public static void main(String[] args) {
          Init i = new Init();

          Init i1 = new Init(22);
          Init i2 = new Init(22,11); 
      }
}


//Console  Output 
1 static init
2 static init
1 instance init
2 instance init
1 constructor init


1 instance init
2 instance init
2 constructor init


1 instance init
2 instance init
3 constructor init



Bir uygulama daha yapip konuyu daha iyi analayalim 

public class Bird {
         static {
                System.out.print("A");
         }

         {
               System.out.print("K");
         }

         public Bird() {
               System.out.print("A");
         }
}



public class Raptor extends Bird {

       static {
             System.out.print("B");
       }

       public Raptor() {
              System.out.print("I");
       }

       {
             System.out.print("D");
       }

       static {
              System.out.print("D");
       }
}


public class Hawk extends Raptor {

       static {
                 System.out.print("U");
       }

       public Hawk() {
                 System.out.print("4");
       }

       {
                 System.out.print("R");
       }

       public static void main(String args[]){
                System.out.print("L");
                new Hawk();
                System.out.println("7");
       }

}
//Console Output
ABDULKADIR47 




 

1 comment: