千萬不要再構造函數調用重載函數,非要調用函數請使用final函數

構造流程

基類的成員數據初始化 >> 基類構造函數 >> 子類成員數據初始化 >> 子類構造函數

產生問題的原因

但是下面的結構違背了這種構造順序,子類的init的方法調用要在子類的構造函數之前執行。

public class BaseClass {

    int id = 0;
    String name = "";

    public BaseClass() {
        System.out.println("BaseClass construct");
        /**
         * 千萬不在構造函數中調用重載方法,成員數據初始化賦值順序和
         * 構造函數調用順序,導致奇怪的問題。
         */
        init();
    }

    protected void init() {
        System.out.println("BaseClass.init");
    }

}

public class InheritClass extends BaseClass {

    int value = 0;
    String desc;

    public InheritClass() {
        System.out.println("InheritClass construct");
    }

    @Override
    protected void init() {
        super.init();

        /** 下面的複製操作會被變量的初始複製給覆蓋掉。
         * 因爲init是在父類構造函數調用,當前類的成員數據還沒有初始化,
         * 等到當前成員初始化時,會把下面的數據賦值又給覆蓋掉。*/
        value = 8;
        desc = "InheritClass";

        System.out.println("InheritClass.init");
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this)
                .append("value", value)
                .append("desc", desc)
                .toString();
    }
}
@Test
    void test() {
        InheritClass inheritClass = new InheritClass();
        System.out.println(inheritClass.toString());
    }
結果:
BaseClass construct
BaseClass.init
InheritClass.init
InheritClass construct
org.ziegler.javabase.thread.inherit.InheritClass@158d2680[value=0,desc=InheritClass]

 

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