Given the code fragment:
class Student {
int rollnumber;
String name;
List cources = new ArrayList();
// insert code here
public String toString() {
return rollnumber + " : " + name + " : " + cources;
}
}
And,
public class Test {
public static void main(String[] args) {
List cs = new ArrayList();
cs.add("Java");
cs.add("C");
Student s = new Student(123, "Fred", cs);
System.out.println(s);
}
}
Which code fragment, when inserted at line // insert code here, enables class Test to print 123 : Fred : [Java, C]?
A.
private Student(int i, String name, List cs) {
/* initialization code goes here */
}
B.
public void Student(int i, String name, List cs) {
/* initialization code goes here */
}
C.
Student(int i, String name, List cs) {
/* initialization code goes here */
}
D.
Student(int i, String name, ArrayList cs) {
/* initialization code goes here */
}
題解
題目原先的程式會在第26行發生編譯錯誤,原因在於Student類別內並沒有實作出Student(int i, String name, List cs)這樣的建構子。因此必須要加入建構子至程式第9行。
選項A,建構子若使用private來修飾,就無法在類別之外被實體化了。
選項B,建構子不能撰寫回傳值的型態,連無回傳值型態「void」都不行。
選項C,正確答案。
選項D,因為隱含式(implicit)的自動轉型只能向上轉型,因此第三個參數應該要是List型態或是List繼承之父類別的物件型態(如Collection、Iterable、Object),而不能是繼承List的子類別(如ArrayList、LinkedList)。