在java中,當我們new一個對象時,對象中的成員,初始化塊以及構造方法的加載是有一定的順序的,看下面一副圖:
一、單類(無基類)下的初始化順序:
public class Parent {
static String staticStr = "父類靜態變量";
private String str = "父類成員變量";
static {
System.out.println(staticStr);
System.out.println("父類靜態初始化塊");
}
{
System.out.println(str);
System.out.println("父類初始化塊");
}
public Parent() {
System.out.println("父類構造");
}
public static void main(String[] args) {
new Parent();
//new Parent();
}
}
輸出:父類靜態變量
父類靜態初始化塊
父類成員變量
父類初始化塊
父類構造
/* 若放開第二行new Parent(),輸出結果會增加以下內容:
父類成員變量
父類初始化塊
父類構造
*/
單類順序: ①靜態(成員,塊) > 非靜態(成員,塊) > 構造
②成員和塊的順序取決於“他們在類中定義時的前後位置,誰靠前誰先被初始化”。
③靜態成員或塊是屬於類的,所以優先初始化,且只會初始化一次。
④構造最後被執行。
二、繼承類的初始化順序
class SubClass extends Parent {
static String staticStr = "子類靜態變量";
private String str = "子類成員變量";
static {
System.out.println(staticStr);
System.out.println("子類靜態初始化塊");
}
{
System.out.println(str);
System.out.println("子類初始化塊");
}
public SubClass() {
System.out.println("子類構造");
}
public static void main(String[] args) {
System.out.println("子類main方法");
new SubClass();
}
}
輸出:父類靜態變量
父類靜態初始化塊
子類靜態變量
子類靜態初始化塊
子類main方法
父類成員變量
父類初始化塊
父類構造
子類成員變量
子類初始化塊
子類構造
繼承類順序:
①父類靜態(成員,塊) > 子類靜態(成員,塊) > 父類非靜態(成員,塊) > 父類構造 > 子類非靜態(成員,塊)> 子類構造
②同樣的,成員和塊的順序和單類中一樣
③先有父才有子,但是子類的靜態(成員和塊)先於父類的非靜態(成員和塊),因為靜態是屬於類的;對於非靜態和構造,自然是父類中全部加載完畢,再加載子類。
關注老姜談技術,微信號:helojava,或者掃描下面二維碼。
每日一帖,技術雞湯。