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。