java類對象的初始化順序


在下面這個例子中,我們分別在父類和子類中測試了靜態代碼塊、普通代碼塊、靜態成員變量、普通成員變量、構造器、靜態內部類

一:代碼塊及變量測試

class Field{
    public static String baseFieldInit(){
        System.out.println("父類全局變量");
        return "";
    }

    public static String baseStaticFieldInit(){
        System.out.println("父類靜態變量");
        return "";
    }

    public static String fieldInit(){
        System.out.println("子類全局變量");
        return "";
    }

    public static String staticFieldInit(){
        System.out.println("子類靜態變量");
        return "";
    }
}

class Father{
    static {
        System.out.println("父類靜態代碼塊1");
    }

    private static String staticValue = Field.baseStaticFieldInit();

    static {
        System.out.println("父類靜態代碼塊2");
    }

    {
        System.out.println("父類構造代碼塊1");
    }

    private String value = Field.baseFieldInit();

    {
        System.out.println("父類構造代碼塊2");
    }

    Father(){
        System.out.println("父類構造器");
    }
}

public class Children extends Father {

    static {
        System.out.println("子類靜態代碼塊1");
    }
    private static String staticValue = Field.staticFieldInit();
    static {
        System.out.println("子類靜態代碼塊2");
    }
    {
        System.out.println("子類構造代碼塊1");
    }
    private String value = Field.fieldInit();
    {
        System.out.println("子類構造代碼塊2");
    }

    public Children(){
        System.out.println("子類無參構造器");
    }

    private static class House{

        private static Children houseColor = new Children();
    }
	/**
	* 測試類
	*/
    public static void main(String[] args) {
        Children children = new Children();
        System.out.println("Children:"+children);
        System.out.println("*******************************");
        
		// 第二遍
		Children children1 = new Children();
        System.out.println("Children:"+children1);
        System.out.println("*******************************");
    }
}

二:測試結果

父類靜態代碼塊1
父類靜態變量
父類靜態代碼塊2
子類靜態代碼塊1
子類靜態變量
子類靜態代碼塊2
父類構造代碼塊1
父類全局變量
父類構造代碼塊2
父類構造器
子類構造代碼塊1
子類全局變量
子類構造代碼塊2
子類無參構造器
Children:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
父類構造代碼塊1
父類全局變量
父類構造代碼塊2
父類構造器
子類構造代碼塊1
子類全局變量
子類構造代碼塊2
子類無參構造器
Children:com.zhixie.jvmclassload.demo.Children@1be6f5c3
*******************************

三:測試靜態內部類

public static void main(String[] args) {
	Children chouse = House.houseColor;
	System.out.println("ChildrenHouse:"+chouse);
	System.out.println("*******************************");
	Children chouse1 = House.houseColor;
	System.out.println("ChildrenHouse:"+chouse1);
	System.out.println("*******************************");
}
父類靜態代碼塊1
父類靜態變量
父類靜態代碼塊2
子類靜態代碼塊1
子類靜態變量
子類靜態代碼塊2
父類構造代碼塊1
父類全局變量
父類構造代碼塊2
父類構造器
子類構造代碼塊1
子類全局變量
子類構造代碼塊2
子類無參構造器
ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************
ChildrenHouse:com.zhixie.jvmclassload.demo.Children@65b54208
*******************************

四:總結

經過我們反復調整順序進行測試后,可得出如下結論:
1、靜態代碼塊、靜態成員變量只有第一次加載類時才會執行。
2、執行順序為:父類靜態代碼塊及父類靜態成員變量(並列優先級)--->子類靜態代碼塊及子類靜態成員變量(並列優先級)--->父類普通代碼塊及父類成員變量--->父類構造器--->子類普通代碼塊及子類成員變量--->子類構造器。
3、靜態內部類,只有在第一次調用的時候才會被初始化。

下一章我們會用今天的代碼來學習一下類的加載順序。

如果文章對您有幫助,請記得點贊關注喲~
歡迎大家關注我的公眾號<情系IT>,每日技術推送文章供大家學習參考。


免責聲明!

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



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