Java 成員方法執行順序

一、三個成員方法:

  1. 普通初始化塊:直接在類裏寫花括號,初始化塊只在創建Java對象時隱式執行,而且在執行構造器之前執行。例子如下:

    public class XXX {
    	{
    		//普通初始化塊的可執行性代碼
    	}
    }
    
  2. 靜態初始化塊:就是定義普通初始化塊時使用了static修飾符,靜態初始化塊只在在類初始化階段執行,而不是在創建對象時才執行,所以只會調用一次。例子如下:

    public class XXX {
    	static {
    		//靜態初始化塊的可執行性代碼
    	}
    }
    
  3. 構造方法:與類名同名的方法,,在創建Java對象時執行。例子如下:

    public class A {
    	A () {
    		//構造方法的可執行性代碼
    	}
    }
    

二、代碼實例

public class FatherClass {

    int value = 11;

    {
        value = 12;
        Log.d("Extends","普通初始化塊-Father");
    }

    static {
         Log.d("Extends","靜態初始化塊-Father");
    }

    FatherClass () {
        Log.d("Extends","構造方法-Father");
    }
}
public class ChildClass extends FatherClass {

    {
        Log.d("Extends","普通初始化塊-ChildClass");
    }

    static {
         Log.d("Extends","靜態初始化塊-ChildClass");
    }

    ChildClass() {
        Log.d("Extends","構造方法-ChildClass");
    }
}

執行:

ChildClass childClass = new ChildClass();
Log.d("Extends","value值:"+childClass.value);

輸出結果爲:

D/Extends: 靜態初始化塊-Father
D/Extends: 靜態初始化塊-ChildClass
D/Extends: 普通初始化塊-Father
D/Extends: 構造方法-Father
D/Extends: 普通初始化塊-ChildClass
D/Extends: 構造方法-ChildClass
D/Extends: value值:12

結論

  1. 單個類執行順序爲:靜態初始化塊—>普通初始化塊—>構造方法。但是靜態初始化塊只會執行一次。

  2. 繼承父類後調用子類時執行順序爲:父類靜態初始化塊—>子類靜態初始化塊—>父類普通初始化塊—>父類構造方法—>子類普通初始化塊—>子類構造方法。

  3. 關於普通賦值:普通初始化塊、聲明實例變量指定的默認值都可以是對象的初始化代碼,執行順序與代碼中的排列順序相同。如FatherClass中,先執行int value = 11;再執行了value = 12;所以value結果爲12。若是將int value == 11;放於普通初始化塊後,如

    {
       value = 12;
       Log.d("Extends","普通初始化塊-Father");
    }
    int value = 11;
    

    則value的值爲11。

  4. 關於靜態變量賦值:與普通賦值一致。

參考:https://www.cnblogs.com/wft1990/p/7998353.html

          https://blog.csdn.net/qq_34626097/article/details/83352293

          https://blog.csdn.net/china_songlei/article/details/79696583

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