綜合歷屆試卷(2016至2023年)的分析,A2 試題的考核核心已完全固定為「將 UML 結構模型(類別圖)轉換為程式碼」。題型統一為:給定一張 UML 類別圖與一段 Java 測試程式(Test.java),要求學生以 Java 語言實作指定的類別(Classes),並寫出該測試程式的預期輸出(Expected output)。
這是在考核學生是否具備將高階的物件導向設計(OOAD)「落地」為實際程式碼的能力。
一、 學生應如何解題(標準解題步驟)
- 剖析類別圖的三層結構: 第一層決定名稱與繼承(extends/implements),第二層決定屬性,第三層決定操作。
- 辨識並實作關聯關係(Associations): 觀察多重性。若為一對多 (1..*),必須在「一」端宣告集合物件 (如 Vector) 並實作 add() 與 Enumeration 方法。
- 從 Test.java 中「挖寶(逆向工程)」:
- 看到
new ClassName(a, b, c) ➜ 補上對應建構子。
- 看到
setSomething/getSomething ➜ 補上 Getter/Setter。
- 處理多型(Polymorphism)與轉型: 注意父類別陣列裝載子類別物件,以及強制轉型與
instanceof 判斷。
- 追蹤數據並寫出預期輸出: 在紙上畫表記錄物件屬性值,跟著迴圈與數學運算,精準推導
println 的結果。
二、 需要背誦的知識與「觸類旁通」全面擴充考點
1. 類別與介面的定義
- 一般與抽象類別:
public abstract class ClassName { ... } (若 UML 為斜體)。
- 抽象方法:
public abstract double getPrice(); (不寫大括號)。
- 介面實作 (擴充):
public interface InterfaceName { ... }。
2. 屬性與可見性
+ (public), - (private), # (protected - 子類別可存取)。
- 類別範圍 (Static): 有底線者加上
static。
- 常數: 不變定值加上
final。
3. 建構子與繼承
- 子類別建構子第一行必須使用
super(args);。
- 方法覆寫建議加上
@Override,並可使用 super.methodName() 呼叫父類別邏輯。
4. 關聯關係的全面實作 (絕對重點 🔥)
一對多 (1..*) 實作:
// 在「一」的一方
private Vector _modules;
public ClassName() { _modules = new Vector(); }
public void addModule(Module m) { _modules.add(m); }
public Enumeration getModules() { return _modules.elements(); }
- 多對多 (無關聯類別): 雙方宣告 Vector,add 方法內作雙向檢查。
- 多對多 (帶有關聯類別): 將關聯實作為獨立 Class,包含雙方物件參考。
- 限定關聯 (Qualified): 必須使用 Hashtable。透過 Key 存取:
_students.put(new Key(id), student);
5. 測試程式解讀與輸出
- Enumeration 走訪機制: 背熟
while(e.hasMoreElements()) 模式。
- 多型判斷 instanceof:
if (module instanceof EnrichmentModule) 過濾子類別。
- 物件字串化 toString(): 若直接印出物件,須實作
public String toString()。