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分割线----

可以看到由于静态代码无需再次初始化。

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