看以下代碼:
class A {
static {
System.out.println("A的static代碼塊...");
}
public String s1 = prtString("A的成員變量...");
public static String s2 = prtString("A的static變量...");
protected A() {
System.out.println("A的構造函數...");
}
{
System.out.println("A的代碼塊");
}
public static String prtString(String str) {
System.out.println(str);
return null;
}
}
class B extends A {
public String ss1 = prtString("B的成員變量...");
public static String ss2 = prtString("B的static變量...");
public B() {
System.out.println("B的構造函數...");
}
static {
System.out.println("B的static代碼塊...");
}
{
System.out.println("B的代碼塊...");
}
}
public class Test {
public static void main(String[] args) {
System.out.println("主函數運行");
B b=new B();
}
}
運行結果:

由上可以得出運行順序:
1. 父類靜態成員和靜態初始化塊 ,按在代碼中出現的順序依次執行
2. 子類靜態成員和靜態初始化塊 ,按在代碼中出現的順序依次執行
3. 父類實例成員和實例初始化塊 ,按在代碼中出現的順序依次執行
4. 父類構造方法
5. 子類實例成員和實例初始化塊 ,按在代碼中出現的順序依次執行
6. 子類構造方法
順序是:當創建類對象時,先初始化靜態變量和靜態塊,然后是非靜態變量和非靜態代碼塊,然后是構造器。由於靜態成員只會被初始化一次,所以如果靜態成員已經被初始化過,將不會被再次初始化
參考文章:
https://blog.csdn.net/lichuangcsdn/article/details/80862036
https://www.cnblogs.com/ipetergo/p/6852790.html
