基礎程式設計(Java)· CH10

多型與介面

多型 · 向上轉型 · 動態繫結 · abstract · final · interface · 導覽地圖

本章列入本學期考試範圍

完整內容看 PDF 講義,互動分派與試跑看 index。

全章主線

變數型別 vs 物件型別

變數宣告型別
決定「能呼叫哪些方法」
Shape s → 只能叫 Shape 的方法
物件實際型別
決定「實際跑哪個版本」
物件是 Circle → 跑 Circle 的 area()

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 (型別==…)

向上轉型

superclass 變數指 subclass 物件

Shape s1 = new Circle(5);   // Circle is-a Shape,自動、安全
Shape[] arr = { s1, new Square(3) };  // 一個陣列裝多種子類別

透過 s1 只看得到 Shape 的方法(看不到 Circle 特有方法);要用回特有方法須向下轉型

抽象

abstract:強制子類別實作

public abstract class Shape {
    public abstract double area();   // 無 body,強制子類別實作
}
// new Shape();  ← 編譯錯:抽象類別不能 new
// new Circle(5); ← OK:具象子類別

有抽象方法的類別必須宣告 abstract、不能 new;子類別沒實作完所有抽象方法,自己也得是 abstract。

禁止改動

final 方法 / final 類別

public final double getBalance() { ... }  // 子類別不能覆寫此方法
public final class String { ... }          // 不能被繼承

final 方法不能覆寫、final 類別不能繼承(如 String);final 方法不參與動態繫結。

契約

interface:純粹的能力契約

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 多個介面(逗號分隔)。

向下轉型

instanceof 先確認再轉

for (Shape s : shapes) {
    if (s instanceof Circle) {        // 先確認實際型別
        Circle c = (Circle) s;        // 安全向下轉型
        System.out.println(c.getRadius());
    }
}

向上轉型自動;向下轉型要明寫 (子類別) 且先 instanceof,否則 ClassCastException

Java 8+ 輕量

default 方法

interface Greeter {
    String name();
    default String greet() { return "Hello, " + name(); }  // 有 body
}

default 方法有 body、可不覆寫直接沿用,不算抽象方法;介面也可有 static 方法。初學知道即可。

接下來

把多型與介面練到自動

  • PDF 講義 完整內容+多型分派/interface 實作藍圖圖
  • index 多型分派互動+試跑+動態繫結步進
  • 本地練習 5 題 介面/抽象/多型陣列/向上轉型/多重介面
  • 複習測驗 自測到 90%