1. 程式人生 > 其它 >JAVA物件初始化步驟

JAVA物件初始化步驟

技術標籤:Javajava

文章目錄


前言


在面向物件的程式語言中,瞭解物件初始化的步驟有利於我們更好地寫成程式碼。


一、物件初始化步驟

  1. 父類靜態變數、靜態程式碼塊初始化
  2. 子類靜態變數、靜態程式碼塊初始化
  3. 父類變數、程式碼塊初始化
  4. 父類構造方法
  5. 子類變數、程式碼塊初始化
  6. 子類構造方法

注意:
1:所有的靜態變數,靜態程式碼塊只會在第一次建立物件時進行初始化
2:變數和程式碼塊的初始化過程是按照在類中定義的順序執行的,如變數a,程式碼塊b,變數c,則初始化過程為a->b->c,不是a->c->b(靜態變數和靜態程式碼塊同理)

二、例項

注意public Father()和public Son()兩行的註釋。

class Father{
    public int num2=4;//5
    public  Father(){//呼叫構造方法時轉到5,去完成變數和程式碼塊的初始化,結束後執行7
        //7
        System.out.println("父類建構函式初始化");
    }
    {//6
        System.out.println("父類程式碼塊初始化");
    }
    static {//1
        System.out.println
("父類靜態程式碼塊初始化"); } public static int num1=2;//2 } class Son extends Father{ public static int num3=6;//3 public Son(){ //呼叫構造方法時轉到父類構造方法處,父類初始化完成後,去完成變數和程式碼塊的初始化,結束後執行10 //10 System.out.println("子類建構函式初始化"); } {//8 System.out.println("子類程式碼塊初始化"
); } public int num4=8;//9 static {//4 System.out.println("子類靜態程式碼塊初始化"); } } public class initializeDemo { public static void main(String[] args) { Son son = new Son(); } /* 執行結果: 父類靜態程式碼塊初始化 子類靜態程式碼塊初始化 父類程式碼塊初始化 父類建構函式初始化 子類程式碼塊初始化 子類建構函式初始化 */ }

三、特殊案例

如果一個類的靜態變數f2建立了該類的物件,則初始化流程有所不同(如果f2建立的不是該類的物件,則f2按照一中所說的步驟執行),此時f2不會執行一中的1.2步。

class Father{
    public int num2=4;
    public static Father f2=new Father();//對f1的靜態變數f2(如果此時f2和f1是同一類的物件)進行初始化時,會先對f2中的非靜態程式碼進行初始化,結束後再按照物件初始化步驟依次執行
    public  Father(){
        System.out.println("建構函式初始化");
    }
    {
        System.out.println("程式碼塊初始化");
    }
    static {
        System.out.println("靜態程式碼塊初始化");
    }

}

public class initializeDemo {
    public static void main(String[] args){
        Father f1 = new Father();
    }
    /*
執行結果:
程式碼塊初始化
建構函式初始化
靜態程式碼塊初始化
程式碼塊初始化
建構函式初始化
     */
}

四、列舉類初始化

在第一次建立列舉類物件時,會一次性初始化所有列舉常量(並不是建立哪個列舉常量就初始化哪個),之後再建立列舉類物件時不再呼叫構造方法。

enum Mark {
    bad("0-60"),common("61-80"),good("81-100");
    private String markRange;
    Mark(String m) {
        markRange= m;
        System.out.println("初始化完成:"+m);
    }
   String getMarkRange() {
        return markRange;
    }
}

public class initializeDemo {
    public static void main(String[] args) {
        Mark good = Mark.good;
        System.out.println("===========");
        Mark bad = Mark.bad;
    }
    /*
執行結果:
初始化完成:0-60
初始化完成:61-80
初始化完成:81-100
===========
     */
}