考慮熟悉的類別結構:基類 Shape,衍生類 Circle、Square、Triangle。

基類在頂端,衍生類向下延伸。OO 目標:用大量代碼控制基類型參考(Shape),新增衍生類(如 Rhomboid)擴展程式不影響原代碼。Shape 介面中動態綁定方法為 draw(),客戶端透過普通 Shape 參考呼叫 draw(),所有衍生類覆寫,動態綁定確保正確行為——這是多型威力。
//: Shapes.java
package c11; import java.util.*;
interface Shape { void draw(); }
class Circle implements Shape { public void draw() { System.out.println("Circle.draw()"); } }
class Square implements Shape { public void draw() { System.out.println("Square.draw()"); } }
class Triangle implements Shape { public void draw() { System.out.println("Triangle.draw()"); } }
public class Shapes {
public static void main(String[] args) {
Vector s = new Vector();
s.addElement(new Circle());
s.addElement(new Square());
s.addElement(new Triangle());
Enumeration e = s.elements();
while(e.hasMoreElements()) ((Shape)e.nextElement()).draw();
}
} ///:~
基類用 interface 最適合(無真實成員、無須建立純 Shape 物件),代碼更清爽。衍生類覆寫 draw() 擁有不同行為。
main() 建立具體型別 → 加入 Vector(上溯造型發生處)。Vector 只裝 Object,上溯造型至 Object 失去所有特殊資訊(甚至不知為幾何形狀)。
取出元素時 nextElement() 回傳 Object 參考,知其為 Shape 故造型 (Shape)——這是最基本 RTTI:所有造型執行期檢查確保正確性。
目前造型只到 Shape,而非具體 Circle 等,因只知 Vector 裝幾何形狀不知具體類別。編譯期靠規則確定,執行期靠造型確定。多型接管後續,為 Shape 呼叫適當方法。
特殊問題需知具體型別才能解決。例:想讓使用者將某具體型別(如三角形)全變紫色突顯。此時需用 RTTI 查詢 Shape 參考引用的確切型別。