Java 類的實例化順序


看以下代碼:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM