Given the class definitions:



class Alpha {
    public String doStuff(String msg) {
        return msg;
    }
}

class Beta extends Alpha {
    public String doStuff(String msg) {
        return msg.replace('a', 'e');
    }
}

class Gamma extends Beta {
    public String doStuff(String msg) {
        return msg.substring(2);
    }
}

And the code fragment of the main() method,

List<Alpha> strs = new ArrayList<Alpha>();
strs.add(new Alpha());
strs.add(new Beta());
strs.add(new Gamma());
for (Alpha t : strs) {
    System.out.println(t.doStuff("Java"));
}

What is the result?

A.

Java
Java
Java

B.

Java
Jeve
va

C.

Java
Jeve
ve

D. Compilation fails

題解

由於「doStuff」是物件方法,因此會發生覆寫(Override)的作用。不管物件如何向上轉型,都需從它的實體物件的所屬類別型態開始向上尋找最後發生覆寫的方法。在這個題目中,「Alpha」、「Beta」、「Gamma」都有覆寫「doStuff」物件方法,所以它們的實體物件都會使用到自己的「doStuff」物件方法。因此輸出結果為:

Java
Jeve
va