1. 程式人生 > >淺談java類中成員的初始化順序(一)

淺談java類中成員的初始化順序(一)

類被建立之後的成員的初始化順序到底是怎麼樣的?

首先 不考慮繼承

package com;

public class DemoOne {
    /**
     * 關於類的初始化順序
     */
    //不考慮繼承結構的情況
    private static int a;
    private String  str="我被賦值了";
    {
        System.out.println("3 進入程式碼塊中  str ===="+ str);
        System.out.println("4 進到普通程式碼塊");


    }
    static
{ System.out.println("1 靜態程式碼塊 a==="+a); //此時a 已經有了初始值0 說明 靜態變數在靜態程式碼塊之前執行 原因是程式碼的前後順序 // 編譯報錯 System.out.println("str ===="+ str); System.out.println("2 進入靜態程式碼塊"); } public DemoOne(){ System.out.println("5 進入構造器"); System.out.println(" 構造器中 str===="+str); System.out.println(
"a===="+a); } public static void main(String[] args) { new DemoOne(); } }

執行程式後輸出結果為:

1 靜態程式碼塊 a===0
2 進入靜態程式碼塊
3 程式碼塊中 str ====我被賦值了
4 進到普通程式碼塊
5 進入構造器
構造器中 str====我被賦值了
a====0

為了驗證靜態成員的順序由程式碼的前後順序決定 講靜態變數和靜態塊順序調整

 

package com;

public class DemoOne {
    /**
     * 關於類的初始化順序
     
*/ //不考慮繼承結構的情況 static{ // 編譯報錯 System.out.println("str ===="+ str); System.out.println("1 進入第一個靜態程式碼塊"); } private static int a; static{ System.out.println("2 進入第二個靜態塊 a===="+a); } private String str="我被賦值了"; { System.out.println("3 進入程式碼塊中 str ===="+ str); System.out.println("4 進到普通程式碼塊"); } public DemoOne(){ System.out.println("5 進入構造器"); System.out.println(" 構造器中 str===="+str); System.out.println("a===="+a); } public static void main(String[] args) { new DemoOne(); } }

輸出結果為:

1 進入第一個靜態程式碼塊
2 進入第二個靜態塊 a====0
3 進入程式碼塊中 str ====我被賦值了
4 進到普通程式碼塊
5 進入構造器
構造器中 str====我被賦值了
a====0

由輸出結果可以看到 調整順序後的靜態塊和靜態變數先後順序發生改變