JAVA對象的加載和對象的初始化

一、對象的初始化順序:(java類加載器加載類的順序:)
(1)加載父類(以下序號相同,表明初始化是按代碼從上到下的順序來的)
  1.爲父類的靜態屬性分配空間並賦於初值
  1.執行父類靜態初始化塊;
(2)加載子類
  2.爲子類的靜態屬性分配空間並賦於初值
  2.執行子類的靜態的內容;
(3)加載父類構造器
  3.初始化父類的非靜態屬性並賦於初值
  3.執行父類的非靜態代碼塊;
  4.執行父類的構造方法;
(4)加載子類構造器
  5.初始化子類的非靜態屬性並賦於初值
  5.執行子類的非靜態代碼塊;
  6.執行子類的構造方法.
總之一句話,靜態代碼塊內容先執行(父先後子),接着執行父類非靜態代碼塊和構造方法,然後執行子類非靜態代碼塊和構造方法。
二、靜態變量和靜態代碼塊的初始化順序:
  誰在前面先初始化誰(這個也比較容易理解,初始化的時候,不可能跳着去初始化吧,比如說靜態代碼塊在靜態變量的前面,不可能先跳過靜態代碼塊的初始化先去執行靜態變量的初始化吧。)
注意:子類的構造方法,不管這個構造方法帶不帶參數,默認的它都會先去尋找父類的不帶參數的構造方法。如果父類沒有不帶參數的構造方法,那麼子類必須用supper關鍵子來調用
父類帶參數的構造方法,否則編譯不能通過。
三、類裝載步驟
在Java中,類裝載器把一個類裝入Java虛擬機中,要經過三個步驟來完成:裝載、鏈接和初始化,其中鏈接又可以分成校驗、準備和解析三步,除了解析外,其它步驟是嚴格按照順序完成的,各個步驟的主要工作如下:
裝載:查找和導入類或接口的二進制數據;
鏈接:執行下面的校驗、準備和解析步驟,其中解析步驟是可以選擇的;
校驗:檢查導入類或接口的二進制數據的正確性;
準備:給類的靜態變量分配並初始化存儲空間;
解析:將符號引用轉成直接引用;
初始化:激活類的靜態變量的初始化Java代碼和靜態Java代碼塊。
初始化類中屬性是靜態代碼塊的常用用途,但只能使用一次。

對象的初始化順序測試代碼

StaticIniBlockOrderTest
StaticIniBlockOrderTest
class Parent {
    static String name ="hello";
    {
        System.out.println("parent block");
    }
    static {
        System.out.println("parent static block");
    }
    public Parent() {
        System.out.println("parent constructor");
    }
}
class Child extends Parent {
    static String childName ="hello";
    {
        System.out.println("child block");
    }
    static {
        System.out.println("child static block");
    }
    public Child() {
        System.out.println("child constructor");
    }
}
publicclass StaticIniBlockOrderTest {
    publicstaticvoid main(String[] args) {
        new Child();// 語句(*)
    }
}

運行結果:

  parent static block
  child static block
  parent block
  parent constructor
  child block
  child constructor

靜態變量和靜態代碼塊的初始化順序測試代碼

publicclass TestOrder {
//靜態變量
publicstatic TestA a =new TestA();

//靜態初始化塊
static {
System.out.println("靜態初始化塊");
}

//靜態變量
publicstatic TestB b =new TestB();

publicstaticvoid main(String[] args) {
new TestOrder();
}
}

class TestA {
public TestA() {
System.out.println("Test--A");
}
}

class TestB {
public TestB() {
System.out.println("Test--B");
}
}

運行結果:

  Test--A 
   靜態初始化塊 
   Test--B

再加一個經典的測試代碼

package static測試;

class insect{
    int i=9;
    int j;

    static {
        prt("static block first,because it's begin of the static variable");
    }

    insect(){
        System.out.println("insect initialized");

       prt("i= "+i+" j="+j);

       j=39;

    }

    static int x1=prt("static insect x1 initialized");

    static int prt(String s){

       System.out.println(s);

       return 47;

    }

}

public class Wps extends insect{

    Wps(){
        System.out.println("wps initialized");

       prt("k="+k);

       prt("j="+j);

    }
    int k=prt("the member k in wps be initialized");

    static int x2=prt("static wps x2 initialized");

    static int prt(String s){

       System.out.println(s);

       return 63;

    } 

public static void main(String[] args){

       insect.prt("initialized constructor");

//       Wps w=new Wps();

    }

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