Static塊和類加載順序


原創:轉載需注明原創地址 https://www.cnblogs.com/fanerwei222/p/11451040.html 

 

版本:Java8

直接上代碼:

public class StaticMain {

    public static int i = 200;

    {
        i = 100;
    }

    public static void main(String[] args){
        System.out.println(i);
    }
}

結果:

 

繼續上代碼:

public class StaticMain {

    {
        i = 100;
    }

    public static int i = 200;

    public static void main(String[] args){
        System.out.println(i);
    }
}

結果:

 

繼續上代碼:

public class StaticMain {

    {
        i = 100;
        System.out.println(i + " : static");
    }

    public static int i = 200;

    public static void main(String[] args){
        System.out.println(i + " : main");
    }
}

結果:

 

 繼續上代碼:

public class StaticMain {

    public static int i = 200;

    {
        i = 100;
        System.out.println(i + " : static");
    }

    public static void main(String[] args){
        System.out.println(i + " : main");
    }
}

結果:

 

 繼續上代碼:

public class StaticMain {

    public static int i;

    {
        i = 100;
        System.out.println(i + " : static");
    }

    public static void main(String[] args){
        System.out.println(i + " : main");
    }
}

結果:

 

 繼續上代碼:

public class StaticMain {

    public static int i;

    {
        i = 100;
        System.out.println(StaticMain.i + " : static");
    }

    public static void main(String[] args){
        System.out.println(StaticMain.i + " : main");
    }
}

結果:

 

接下來改變一下:

繼續上代碼:

public class StaticMain {

    public static int i;

    {
        i = 100;
        System.out.println(StaticMain.i + " : static");
    }

    public static void main(String[] args){
        StaticMain staticMain = new StaticMain();
        System.out.println(StaticMain.i + " : main");
    }
}

結果:

 

 繼續上代碼:

public class StaticMain {

    public static int i = 200;

    {
        i = 100;
        System.out.println(StaticMain.i + " : static");
    }

    public static void main(String[] args){
        StaticMain staticMain = new StaticMain();
        System.out.println(StaticMain.i + " : main");
    }
}

結果:

 

 繼續上代碼:

public class StaticMain {

    {
        i = 100;
        System.out.println(StaticMain.i + " : static");
    }

    public static int i = 200;

    public static void main(String[] args){
        StaticMain staticMain = new StaticMain();
        System.out.println(StaticMain.i + " : main");
    }
}

結果:

 

結論: 靜態塊中的變量是先拿到定義再在后續拿到實際變量之后再進行后續對變量的操作的; 如果不初始化靜態塊所屬類,靜態塊將不會因為他的所屬類的調用而被加載.

 附:類初始化時的順序: 

   1、類內容(靜態變量、靜態初始化塊) => 實例內容(變量、初始化塊、構造器)
   2、父類的(靜態變量、靜態初始化塊)=> 子類的(靜態變量、靜態初始化塊)=> 父類的(變量、初始化塊、構造器)=> 子類的(變量、初始化塊、構造器)

 

結束🔚


免責聲明!

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



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