一、三個成員方法:
-
普通初始化塊:直接在類裏寫花括號,初始化塊只在創建Java對象時隱式執行,而且在執行構造器之前執行。例子如下:
public class XXX { { //普通初始化塊的可執行性代碼 } }
-
靜態初始化塊:就是定義普通初始化塊時使用了static修飾符,靜態初始化塊只在在類初始化階段執行,而不是在創建對象時才執行,所以只會調用一次。例子如下:
public class XXX { static { //靜態初始化塊的可執行性代碼 } }
-
構造方法:與類名同名的方法,,在創建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
結論
-
單個類執行順序爲:靜態初始化塊—>普通初始化塊—>構造方法。但是靜態初始化塊只會執行一次。
-
繼承父類後調用子類時執行順序爲:父類靜態初始化塊—>子類靜態初始化塊—>父類普通初始化塊—>父類構造方法—>子類普通初始化塊—>子類構造方法。
-
關於普通賦值:普通初始化塊、聲明實例變量指定的默認值都可以是對象的初始化代碼,執行順序與代碼中的排列順序相同。如FatherClass中,先執行int value = 11;再執行了value = 12;所以value結果爲12。若是將int value == 11;放於普通初始化塊後,如
{ value = 12; Log.d("Extends","普通初始化塊-Father"); } int value = 11;
則value的值爲11。
-
關於靜態變量賦值:與普通賦值一致。
參考: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