Given:



class Sports {

    int num_players;
    String name, ground_condition;

    Sports(int np, String sname, String sground) {
        num_players = np;
        name = sname;
        ground_condition = sground;
    }
}

class Cricket extends Sports {

    int num_umpires;
    int num_substitutes;
    
    //insert code here
}

Which code fragment can be inserted at line "//insert code here" to enable the code to compile?

A.

Cricket() {
    super(11, "Cricket", "Condidtion OK");
    num_umpires = 3;
    num_substitutes= 2;
}
B.
Cricket() {
    super.ground_condition = "Condition OK";
    super.name= "Cricket";
    super.num_players = 11;
    num_umpires = 3;
    num_substitutes= 2;
}
C.
Cricket() {
    this(3,2);
    super(11, "Cricket", "Condidtion OK");
}
Cricket(int nu, int ns) {
    this.num_umpires = nu;
    this.num_substitutes= ns;
}
D.
Cricket() {
    this.num_umpires = 3;
    this.num_substitutes = 2;
    super(11, "Cricket", "Condidtion OK");
}

題解

這題是考建構子的觀念。每個類別都至少擁有一個建構子,若類別並沒有實作建構子,則其在編譯時還是會預設加入一段建構子程式。以題目「Cricket」這個類別為例,一開始並沒有實作建構子,所以編譯器會自動加入以下這段程式:

public Cricket(){}

再來,所有的建構子在執行的時候都會最先呼叫父類別的建構子或是自己類別其他的建構子。如果建構子內並沒有指定要先呼叫哪個建構子,那會編譯器會一律在建構子的第一行程式加上「super();」敘述。以題目「Cricket」這個類別為例,調整建構子之後會變成下面這個樣子:

class Cricket extends Sports {

    int num_umpires;
    int num_substitutes;
    
    public Cricket(){
        super();
    }
}

由於Cricket的父類別「Sports」,並沒有「Sports()」這個建構子,因此原本的程式會編譯失敗。所以這題目要求替Cricket類別加上正確的建構子,使得程式能夠成功編譯。

選項A在新的建構子內的第一行加上「super(11, "Cricket", "Condidtion OK");」,呼叫原本就存在於Sports類別的「Sports(int np, String sname, String sground)」建構子,因此加上這段程式可以使程式編譯成功。
選項B的新建構子並沒有在第一行使用「super」或是「this」敘述,編譯器會自動加上「super();」,但是Sports類別並沒有「Sports()」這個建構子,因此一樣會編譯失敗。
選項C的新建構子內雖然有加入「super(11, "Cricket", "Condidtion OK");」,但它放在第二行,因此會編譯錯誤。要用「super」呼叫父類別的建構子,只能在建構子的第一行使用。
選項D編譯錯誤的理由和選項C一樣。