Given:



abstract class Shape {
    Shape() { System.out.println("Shape"); }
    protected void area() { System.out.println("Shape"); }
}

class Square extends Shape {
    int side;
    Square(int side) {
        /* insert code here */
        this.side = side;
    }
    public void area() { System.out.println("Square"); }
}
class Rectangle extends Square {
    int len, br;
    Rectangle(int x, int y) {
        /* insert code here */
        len = x; br = y;
    }
    void area() { System.out.println("Rectangle"); }
}

Which two modifications enable the code to compile?

A. At line 1, remove abstract
B. At line 9, insert super();
C. At line 12, remove public
D. At line 17, insert super(x);
E. At line 17, insert super(); super.side = x;
F. At line 20, use public void area () {

題解

原先題目的程式會在第16行和第20行編譯錯誤,原因在於Rectangle類別的建構子沒有指定要先呼叫哪個建構子,因此會自動加上「super();」去呼叫Square類別沒有參數的建構子,但這個建構子並不存在。而Rectangle類別中的area方法,覆寫了Square類別中的area方法,但是可見度卻從public降到default,這是不被允許的。

所以說,選項D和選項F是正確的。

選項C不行的原因在於,Shape類別的area方法之可見度為protected,所以Square類別的area方法之可見度必定也不能低於protected。