針對構造函數相關考點的筆試題:
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()的調用在第一行實現【以此來創建對象】,防止發生異常。