Given:
class Base {
public void test() {
System.out.println("Base ");
}
}
class DerivedA extends Base {
public void test() {
System.out.println("DerivedA");
}
}
class DerivedB extends DerivedA {
public void test() {
System.out.println("DerivedB");
}
public static void main(String[] args) {
Base b1 = new DerivedB();
Base b2 = new DerivedA();
Base b3 = new DerivedB();
b1 = (Base) b3;
Base b4 = (DerivedA) b3;
b1.test();
b4.test();
}
}
What is the result?
A.
Base
DerivedA
DerivedA
B.
Base
DerivedB
DerivedB
C.
DerivedB
DerivedB
DerivedB
D.
DerivedB
DerivedA
DerivedA
E. A classcast Except ion is thrown at runtime.
題解
「DerivedB.java」檔案的main方法中的b1、b3和b4這三個變數在第12行執行結束後,所參考到的物件實體都是從DerivedB類別實體化出來的第二個物件。Base類別的test方法在DerivedB類別中被覆寫,因此「DerivedB.java」檔案中的第13~14行程式會去執行第3行的test方法。