基礎程式設計(Java)· CH10
多型 · 向上轉型 · 動態繫結 · abstract · final · interface · 導覽地圖
本章列入本學期考試範圍
完整內容看 PDF 講義,互動分派與試跑看 index。
全章主線
Shape s = new Circle(); s.area() 跑 Circle 版——這就是動態繫結。
核心
Shape[] shapes = { new Circle(2), new Square(3) };
for (Shape s : shapes)
System.out.println(s.area()); // Circle 跑 πr²、Square 跑邊長²
同一行 s.area() 不變,依物件實際型別自動分派——不必寫一堆 if (型別==…)。
向上轉型
Shape s1 = new Circle(5); // Circle is-a Shape,自動、安全
Shape[] arr = { s1, new Square(3) }; // 一個陣列裝多種子類別
透過 s1 只看得到 Shape 的方法(看不到 Circle 特有方法);要用回特有方法須向下轉型。
抽象
public abstract class Shape {
public abstract double area(); // 無 body,強制子類別實作
}
// new Shape(); ← 編譯錯:抽象類別不能 new
// new Circle(5); ← OK:具象子類別
有抽象方法的類別必須宣告 abstract、不能 new;子類別沒實作完所有抽象方法,自己也得是 abstract。
禁止改動
public final double getBalance() { ... } // 子類別不能覆寫此方法
public final class String { ... } // 不能被繼承
final 方法不能覆寫、final 類別不能繼承(如 String);final 方法不參與動態繫結。
契約
public interface Payable { double getPaymentAmount(); }
class Invoice implements Payable {
@Override public double getPaymentAmount() { ... } // 必須實作
}
Payable p = new Invoice(...); // 介面當型別,多型一樣成立
介面方法預設 public abstract;介面不能 new、能當型別。抽象類別=is-a,介面=can-do。
多重能力
class Bird extends Animal implements Flyable, Comparable<Bird> {
@Override public void fly() { ... }
@Override public int compareTo(Bird o) { ... }
}
類別只能 extends 一個父類別,卻能 implements 多個介面(逗號分隔)。
向下轉型
for (Shape s : shapes) {
if (s instanceof Circle) { // 先確認實際型別
Circle c = (Circle) s; // 安全向下轉型
System.out.println(c.getRadius());
}
}
向上轉型自動;向下轉型要明寫 (子類別) 且先 instanceof,否則 ClassCastException。
Java 8+ 輕量
interface Greeter {
String name();
default String greet() { return "Hello, " + name(); } // 有 body
}
default 方法有 body、可不覆寫直接沿用,不算抽象方法;介面也可有 static 方法。初學知道即可。
接下來