天天看點

JAVA 初始化順序

http://ilexes.blog.51cto.com/705330/268868

  //JAVA初始化分兩大步 

//A、類的加載

//

//        先加載父類,在加載子類

//        加載父類後,完成靜态動作【靜态變量、靜态代碼塊(主動執行僅一次)】(按代碼順序)、【靜态方法(被動執行)】

//        加載子類後,完成靜态動作【靜态變量、靜态代碼塊(主動執行僅一次)】(按代碼順序)、【靜态方法(被動執行)】

//B、類的執行個體化

//        先執行個體化父類,在執行個體化子類

//        

//        執行個體化父類,完成執行個體化【成員變量、初始化塊】(按代碼順序)、【父類構造方法】、【成員方法(被動執行)】

//    

//        執行個體化子類,完成執行個體化【成員變量、初始化塊】(按代碼順序)、【子類構造方法】、【成員方法(被動執行)】

//注:類裝載步驟(詳解A步驟)

//     在Java中,類裝載器把一個類裝入Java虛拟機中,要經過三個步驟來完成:裝載、連結和初始化,其中連結又可以分成校驗、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:

//裝載:查找和導入類或接口的二進制資料; 

//連結:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的; 

//校驗:檢查導入類或接口的二進制資料的正确性; 

//準備:給類的靜态變量配置設定并初始化存儲空間; 

//解析:将符号引用轉成直接引用; 

//初始化:激活類的靜态變量的初始化Java代碼和靜态Java代碼塊。 

//初始化類中屬性是靜态代碼塊的常用用途,但隻能使用一次。

package cn.ilex;

public class InitClass2 extends Parent2 {

        // 初始化塊        

        {        

                new PrintStr2("子類--初始化塊");        

        }    

        // 靜态變量        

  public static PrintStr2 a=new PrintStr2("子類--靜态變量");

  // 變量        

  public PrintStr2 b=new PrintStr2("子類--執行個體變量");

  // 靜态初始化塊        

        static {        

            new PrintStr2("子類--靜态初始化塊(主動執行)");        

        }        

        // 構造器        

        public InitClass2() {        

            new PrintStr2("子類--構造器");     

        public void callParentStaticMethod(){

          Parent2.printString(this.getClass().getName()+"callParentStaticMethod()方法 ");

        }

        // 程式入口        

        public static void main(String[] args) {        

            Parent2.printString(" InitClass類 main() 方法");

            new PrintStr2("子類--進入程式入口 (靜态方法) InitClass main()");

            new PrintStr2("子類--開始執行個體化 new InitClass()");

            new InitClass2().callParentStaticMethod();    

}

class Parent2 {        

        // 靜态初始化塊        

            new PrintStr2("父類--靜态初始化塊(主動執行)");        

        public static String str="父類--靜态方法被調用前加載完成的靜态變量";

  // 靜态變量        

        public static PrintStr2 c=new PrintStr2("父類--靜态變量");

        // 變量        

     public PrintStr2 d=new PrintStr2("父類--執行個體變量");

             new PrintStr2("父類--初始化塊");        

        public Parent2() {        

            new PrintStr2("父類--構造器");        

        public static void printString(String s){

          new PrintStr2("父類--靜态方法(被"+s+"調用執行)."    );

          new PrintStr2( "父類--靜态方法調用自己的靜态變量:str="+Parent2.str );

}        

class PrintStr2{

  private static int i=0;

  static {

    Parent2.printString("PrintStr2 類靜态塊");

  }

  public    static    int getCount(){

    return i++;

  } 

  public PrintStr2(String s){

    System.out.println(PrintStr2.getCount()+"."+s);

  public String toString(){

    return " PrintStr2 類型的";