關於JAVA繼承類的靜態變量、成員變量、父子類構造方法調用順序的研究

綜合網上的相關帖子和我自己的調試,研究了一下關於JAVA繼承類的靜態變量、成員變量、父子類構造方法調用順序問題。首先看一段程序:

class X {
 Y b = new Y();// 7、這裏是父類成員變量初始化

 static Y sb = new Y();// 1行、父類靜態變量,輸出static Y(靜態代碼塊先初始化),2行:Y

 static {
  System.out.println("static X父類靜態代碼塊");// 3行、執行靜態代碼塊
  new Y();// 4行、這裏只是輸出Y,有static Y(靜態代碼塊只執行一次)
 }
 
 X() {
  System.out.println("X");// 8、父類成員變量初始化之後,執行父類構造器輸出X
 }
}

class Y {
 static {
  System.out.println("static Y");
 }

 Y() {// 執行構造函數
  // 這裏有個super()==Object()
  System.out.println("Y");
 }
}

public class Zextends X { //從這裏開始繼承會調用父類的static和static成員變量:2:
 final static int mead=45;
    final byte b=16;
    static Y sb= new Y();//5行、子類的靜態變量,輸出Y
    static{      
        System.out.println("static Z");//6行、子類的靜態代碼塊
    }
    Y y = new Y();//9、這裏是子類成員變量初始化

    Z() {
        //這裏有super()==new X()
        this.y = null;
        System.out.println("Z");//10、子類成員變量初始化之後,執行子類構造器輸出Z
    }

 

 public static void main(String[] args) {
  new Z();
 }
}

/*總結:1:繼承類時會調用父類的Static的成員變量和Static代碼塊、順序是按照2個Static代碼的先後順序執行
 * 2:繼承情況下,首先是從頂層父類的靜態變量和代碼塊開始執行,依次向下。同一個類中,執行的順序是依照靜態變量和靜態代碼在類中的編碼順序執行,
 * 變量和代碼塊無任何優先級之分。全部繼承樹中的類靜態變量和代碼塊都初始化完畢後,開始從頂層父類執行非靜態的類變量和類代碼塊初始化,執行順序同靜態,
 * 然後緊接着是執行構造函數,完畢後才向下,執行子類的類變量、代碼塊和構造函數。 非靜態內部類中不能定義類靜態代碼塊和非final的類靜態變量;靜態內部類,
 * 可以聲明非final的靜態變量和靜態代碼塊。
 */

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/pisota/archive/2010/02/27/5332848.aspx

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