繼承中構造方法的關係

一、子類中所有的構造方法默認都會訪問父類中無參的構造方法

因爲子類會繼承父類中的數據,可能還會使用父類的數據。所以子類初始化之前,一定要先完成父類數據的初始化。
其實子類的每一個構造方法的第一條語句默認都是:super()

/*
    eg1.
    程序測試結果:
        Father的無參構造方法
        Son的無參構造方法
*/
class Father {
    int age;

    public Father() {
        System.out.println("Father的無參構造方法");
    }
}

class Son extends Father {
    public Son() {
        //super();//隱含。其實子類的每一個構造方法的第一條語句默認都是:super()
        System.out.println("Son的無參構造方法");
    }
}   

class ExtendsDemo{
    public static void main(String[] args) {
        //創建對象
        Son s = new Son();
    }
}
/*
    eg2.
    程序測試結果:
        Father的無參構造方法
        Son的無參構造方法
        ------------
        Father的無參構造方法
        Son的帶參構造方法
*/

class Father {
    int age;

    public Father() {
        System.out.println("Father的無參構造方法");
    }

    public Father(String name) {
        System.out.println("Father的帶參構造方法");
    }
}

class Son extends Father {
    public Son() {
        //super()//子類中隱含
        System.out.println("Son的無參構造方法");
    }

    public Son(String name) {
        //super()//子類中隱含
        System.out.println("Son的帶參構造方法");
    }
}   

class ExtendsDemo{
    public static void main(String[] args) {
        //創建對象
        Son s = new Son();
        System.out.println("------------");

        Son s2 = new Son("林青霞");
    }
}

二、如果父類沒有無參構造方法,那麼子類的構造方法會出現什麼現象?如何解決?

推薦,永遠手動給出無參構造。如果習慣好,就不會碰到這種問題。
如,以下code:只給了有參。把默認無參構造都覆蓋掉了,都起不了作用了。
現象:報錯。

//結果:報錯
class Father {
    //只給了有參。把默認無參都覆蓋掉了。
    public Father(String name) {
        System.out.println("Father的帶參構造方法");
    }
}

class Son extends Father {
    public Son() {
        System.out.println("Son的無參構造方法");
    }

    public Son(String name) {
        System.out.println("Son的帶參構造方法");
    }
}

class ExtendsDemo7 {
    public static void main(String[] args) {
        //Son s = new Son();
        //System.out.println("----------------");
        //Son ss = new Son("林青霞");
    }
}

解決
1)在父類中加一個無參構造。
2)使用super關鍵字。用super(…)帶參方法去顯示的調用父類的帶參構造方法。
3)子類通過this去調用本類的其他構造方法。
子類中一定要有一個去訪問了父類的構造方法,否則,父類的數據就沒有初始化。

注意:
this(…)或者super(…)方法必須出現在第一條語句上。
如果不是放在第一條語句上,就可能對父類的數據進行了多次初始化,所以必須放在第一條。

/*
    採用super(...)解決

        程序測試結果:
        Father的帶參構造方法
        Son的無參構造方法
        ------------
        Father的帶參構造方法
        Son的帶參構造方法
*/

class Father {
    private String name;

    //只給了有參。把無參都覆蓋掉了。
    public Father(String name) {
        System.out.println("Father的帶參構造方法");
    }
}

class Son extends Father {
    public Son() {
        super("給一字符");//配合父類構造方法的參數情況
        System.out.println("Son的無參構造方法");
    }

    public Son(String name) {
        super(name);//配合父類構造方法的參數情況 正好這個Son方法傳進來了一個name參
        System.out.println("Son的帶參構造方法");
    }
}

class ConstructorTest {
    public static void main(String[] args) {
        Son s = new Son();
        System.out.println("----------------");
        Son ss = new Son("林青霞");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章