靜態塊、自由塊及構造函數的執行順序

靜態塊格式:
    static
   {
    }
    靜態塊在類被加載的時候執行,又因爲加載子類時,會預先加載父類,因此父類中如果有靜態塊,則最先執行。然後立即執行子類的靜態塊。
    如果一個類中有多個靜態塊,則按照編碼的先後順序執行。
    注:由於類只會被加載一次,因此每個靜態塊便只會執行一次。
    自由塊格式:
   {
    }
    自由塊在類被實例化時執行。
    如果要實例化一個子類,那麼他的構造函數會先實例化其父類。因此父類的自由塊會先被執行,然後開始構造父類。父類的構造器執行完畢後,操作權返回給子類的構造器,此時開始執行子類的自由塊。
然後開始構造子類。
    以下爲融合了父類靜態塊、子類靜態塊,父類自由塊、子類自由塊,父類構造函數、子類構造函數,this關鍵字、super關鍵字的一個例子,感覺很值得分析,值得記錄。

 

package com.lsky.test;

public class Father {
 private int  sum;
 //父類中的靜態塊
 static{
  System.out.println("2010年新年快樂");
 }
 public void  first(int i){
  sum=++i+sum++-1+i--;
  System.out.println(sum);
 }
 //父類無參構造器
 public Father(){
  System.out.println("美好的一天");
 }
 //含參數構造器
 public Father(String s){
  System.out.println("我們是學生");
 }
 //父類中的自由塊
 {
 System.out.println("菩提本無樹,明鏡亦非臺,本來無一物,何處惹塵埃");
 }
}

package com.lsky.test;

public class Son extends Father {
 private int sum;
 private static Father father;
 //子類中含參構造器(含參構造函數)
 public Son(Father father){
  this();
  father.first(8);
 }
 //子類中無參構造器(無參構造函數)
 public Son(){

  this.punk(6);
 }
  public void  first(int i){
  sum=sum+i++;
  System.out.println(sum);
 }
  //子類中的靜態塊
  static{
   Father f=new Son();
   f.first(4);
  }
  int punk(int sum){
   sum=sum;
   return sum;
  }
  //子類中的自由塊
  {
   System.out.println("曾經滄海難爲水,除卻巫山不是雲");
  }
  public static void main(String argsp[]){
   
   Son son=new Son(new Son());
  
  }
}

//輸出結果爲:

  2010年新年快樂
  菩提本無樹,明鏡亦非臺,本來無一物,何處惹塵埃
  美好的一天
  曾經滄海難爲水,除卻巫山不是雲
  4
  菩提本無樹,明鏡亦非臺,本來無一物,何處惹塵埃
  美好的一天
  曾經滄海難爲水,除卻巫山不是雲
  菩提本無樹,明鏡亦非臺,本來無一物,何處惹塵埃
  美好的一天
  曾經滄海難爲水,除卻巫山不是雲
  8



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章