java 類初始化順序

寫demo驗證一下。
PS: 我是Android 開發工程師,新建android工程驗證


public class BaseClass {
    // 靜態變量
    public static String staticField = "classTest BaseClass 靜態變量";

    // 靜態初始化塊
    static {
        System.out.println(staticField);
        System.out.println("classTest BaseClass 靜態初始化塊");
    }

    // 變量
    public String field = "classTest BaseClass 變量";

    // 初始化塊
    {
        System.out.println(field);
        System.out.println("classTest BaseClass 初始化塊");
    }

    // 構造器
    public  BaseClass() {
        System.out.println("classTest BaseClass 構造器");
    }
}

public class ChildClass extends BaseClass {
    // 靜態變量
    public static String staticField = "classTest ChildClass 靜態變量";

    // 靜態初始化塊
    static {
        System.out.println(staticField);
        System.out.println("classTest ChildClass 靜態初始化塊");
    }

    // 變量
    public String field = "classTest ChildClass 變量";

    // 初始化塊
    {
        System.out.println(field);
        System.out.println("classTest ChildClass 初始化塊");
    }

    // 構造器
    public ChildClass() {
        System.out.println("classTest ChildClass 構造器");
    }
}

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        testClassInit();
    }


    private void testClassInit() {
        System.out.println("classTest -----我是start分割線----");
        new BaseClass();
        System.out.println("classTest -----我是mid分割線----");
        new ChildClass();
        System.out.println("classTest -----我是end分割線----");
    }
}

result:
首次進入程序:

11-10 17:36:15.070 18368-18368/? I/System.out: classTest -----我是start分割線----
11-10 17:36:15.070 18368-18368/? I/System.out: classTest BaseClass 靜態變量
11-10 17:36:15.070 18368-18368/? I/System.out: classTest BaseClass 靜態初始化塊
11-10 17:36:15.070 18368-18368/? I/System.out: classTest BaseClass 變量
11-10 17:36:15.070 18368-18368/? I/System.out: classTest BaseClass 初始化塊
11-10 17:36:15.070 18368-18368/? I/System.out: classTest BaseClass 構造器
11-10 17:36:15.070 18368-18368/? I/System.out: classTest -----我是mid分割線----
11-10 17:36:15.070 18368-18368/? I/System.out: classTest ChildClass 靜態變量
11-10 17:36:15.070 18368-18368/? I/System.out: classTest ChildClass 靜態初始化塊
11-10 17:36:15.070 18368-18368/? I/System.out: classTest BaseClass 變量
11-10 17:36:15.070 18368-18368/? I/System.out: classTest BaseClass 初始化塊
11-10 17:36:15.070 18368-18368/? I/System.out: classTest BaseClass 構造器
11-10 17:36:15.070 18368-18368/? I/System.out: classTest ChildClass 變量
11-10 17:36:15.070 18368-18368/? I/System.out: classTest ChildClass 初始化塊
11-10 17:36:15.070 18368-18368/? I/System.out: classTest ChildClass 構造器
11-10 17:36:15.070 18368-18368/? I/System.out: classTest -----我是end分割線----

按back鍵後回到桌面此時程序未被kill,如果按多任務鍵會看到還在後臺,然後再點擊icon啓動:

11-10 17:40:24.105 18368-18368/com.example.bxh.sayhello I/System.out: classTest -----我是start分割線----
11-10 17:40:24.106 18368-18368/com.example.bxh.sayhello I/System.out: classTest BaseClass 變量
11-10 17:40:24.106 18368-18368/com.example.bxh.sayhello I/System.out: classTest BaseClass 初始化塊
11-10 17:40:24.106 18368-18368/com.example.bxh.sayhello I/System.out: classTest BaseClass 構造器
11-10 17:40:24.106 18368-18368/com.example.bxh.sayhello I/System.out: classTest -----我是mid分割線----
11-10 17:40:24.106 18368-18368/com.example.bxh.sayhello I/System.out: classTest BaseClass 變量
11-10 17:40:24.106 18368-18368/com.example.bxh.sayhello I/System.out: classTest BaseClass 初始化塊
11-10 17:40:24.106 18368-18368/com.example.bxh.sayhello I/System.out: classTest BaseClass 構造器
11-10 17:40:24.106 18368-18368/com.example.bxh.sayhello I/System.out: classTest ChildClass 變量
11-10 17:40:24.106 18368-18368/com.example.bxh.sayhello I/System.out: classTest ChildClass 初始化塊
11-10 17:40:24.106 18368-18368/com.example.bxh.sayhello I/System.out: classTest ChildClass 構造器
11-10 17:40:24.106 18368-18368/com.example.bxh.sayhello I/System.out: classTest -----我是end分割線----

可以看到由於靜態代碼無需再次初始化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章