[Java] 筆試題 - 構造函數考點

針對構造函數相關考點的筆試題:

class CD {

    int r;

    CD(int r) {
        this.r = r;
    }
}

class DVD extends CD {

    int c;

    DVD(int r, int c) {
        // line n1
    }
}

And given the code fragment:

DVD dvd = new DVD(10, 20);

Which code fragment should you use at line n1 to instantiate the dvd object successfully?

A:
super.r = r;
this.c = c;

B:
super(r);
this(c);

C:
super(r);
this.c = c;

D:
this.c = r;
super(c);

問題:第n1行應該使用哪個代碼片段成功實例化dvd對象?

知識點明確:

1:構造函數不能被繼承,只是調用而已。

2:如果類中創建了有參構造函數後,系統就不再有默認無參構造函數。如果沒有任何構造函數,系統會默認有一個無參構造函數。

3:父類如果沒有創建構造函數(沒有顯示的創建有參和無參構造函數,系統默認有一個無參構造函數),子類可以不寫構造函數(可以理解爲:子類的系統默認構造函數,默認調用了super();)

4:如果父類沒有無參構造函數,有且只創建了有參構造函數,

創建子類時,不能編譯,除非在構造函數代碼體中第一行,必須是第一行顯式調用父類有參構造函數,即super(參數名)。

 

針對該知識點,

因爲父類CD類中不存在「CD()」這樣的無參構造函數,因此如果不修改 line n1,一定會出現編譯錯誤。

所以答案一定需要符合如下的 code:

DVD(int r, int c) {
    super();
}

答案A:沒有使用super或者this來調用別的構造方法,無法解決編譯錯誤

答案B:this(c) 會出現編譯錯誤,因爲在子類DVD中只有一個雙參數構造方法,沒有一個參數的構造方法

答案C:正確答案符合考點的知識點。

答案D:super(c) 必須放在第一行,否則無法正常編譯。

爲什麼this(),super()必須放在第一行?

this()和super()調用構造方法,作用是在JVM堆中構建出一個對象。因此避免多次創建對象,同一個方法內只能調用一次this()或super()。同時爲了避免操作對象時對象還未構建成功(在執行任何動作前,需要確保對象已經完成了初始化),需要this()和super()的調用在第一行實現【以此來創建對象】,防止發生異常。

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