前五週你已經學會了 Java 的「動詞」:變數、迴圈、陣列、函式、遞迴、例外處理, 也初步認識了類別(class)與物件(object)。 從第 6 週開始,課程的重心轉向如何把程式組織成可以長大、可以測試、可以被別人安心使用的形狀 ——這就是的核心, 也是 Week 5 測驗之後、期末專案之前最關鍵的兩週。
本教材依照課程網站的週次表,完整涵蓋以下內容:
@llL0.56@ 週次 & 活動 & 主題(本教材章節)
& Lecture 06A & 封裝、抽象資料型別、介面(第 [sec:encap]、[sec:adt] 節)
& Lecture 06B & 子型別、Liskov 替換原則、繼承(第 [sec:subtyping] 節)
& Workshop & 聊天協定設計(第 [sec:ws6] 節,COMP1140 專案)
& Lab & 遞迴、排序(第 [sec:lab] 節)
& Lecture 07A & JUnit 測試、測試驅動開發、轉型、泛型、Collections(第 [sec:junit]、[sec:generics] 節)
& Lecture 07B & 雜湊函數、雜湊表、攤銷複雜度(第 [sec:hash] 節)
& Workshop & 聊天客戶端介面設計(第 [sec:ws7] 節,COMP1140 專案)
讀完之後你將能夠:
用 欄位與公開方法守住資料不變量,並說出「封裝」帶來的兩個好處。
用 定義抽象資料型別,寫出多種可互換的實作,並理解「宣告型別決定你能呼叫什麼」。
分辨子型別與繼承,解釋動態分派,並用 LSP 的四條規則判斷一個繼承關係是否「行為上正確」。
用 JUnit 5 寫黑箱單元測試、依測試驅動開發的節奏工作,並用攤銷分析解釋為什麼陣列倍增的插入是 \(\bigO{1}\)。
讀懂並寫出泛型類別與方法,知道型別擦除的限制,熟練使用 //。
說出好的雜湊函數該有的性質、解釋雜湊表如何達到平均 \(\bigO{1}\),並避開 / 與可變鍵的地雷。
每一節開頭是觀念,接著是完整可執行的範例,最後是練習(附解答)。 建議邊讀邊把 資料夾裡對應的程式打開來跑。
「 定義」框是考試會直接問的東西;「 注意」框是實作時最常踩的坑。
第 [sec:ws6]、[sec:ws7] 節的 Workshop 內容屬於 COMP1140(進階班)專案, COMP1110/6710 的同學不會被考,但其中的介面設計思維正是 Lecture 06A、07A 的最佳應用範例,很值得一讀。
第 [sec:review] 節是總複習:觀念地圖、常見錯誤清單與 20 題自我測驗。
兩週的觀念地圖
圖 1 把這兩週的所有主題串成一張圖: 左邊是「如何把資料與行為包起來」,中間是「如何讓不同的包裝可以互換」, 右邊是「如何確認它們真的正確、真的夠快」。你會發現所有主題最後都指向同一個目標—— 寫出別人(包括三個月後的你自己)可以安心使用與修改的程式。
關於 Java 版本與課堂寫法
課程講義使用 Java 25 的兩個新寫法;為了讓範例能在任何 Java 17 以上的環境(含 IntelliJ 預設設定)編譯, 本教材與隨附程式一律使用「傳統寫法」。兩者完全等價,對照如下:
@lL0.58@ 課程講義(Java 25) & 本教材(相容寫法)
&
(放在一個 裡)
&
& (先印出提示)
隨附程式怎麼跑
底下每個資料夾都是獨立的一組範例,各自有一個含 的類別 (、 或以測試命名)。在該資料夾內:
$ javac *.java # 編譯資料夾內所有檔案
$ java -ea Main # 執行;-ea 開啟 assert(教材所有自我檢查都依賴它)
唯一的例外是 :它的測試需要 JUnit 5。 在 IntelliJ 中把游標停在紅色的 上按 → 「Add JUnit5 to classpath」即可; 命令列的做法見第 [sec:junit-run] 節。
@llL0.50@ 資料夾 & 對應章節 & 內容
& §[sec:encap] & 、、、
& §[sec:adt] & 兩種實作、 與鏈結串列實作
& §[sec:subtyping] & 抽象類別 家族、LSP 合規與違規範例
& §[sec:lab] & 遞迴函式集、四種排序與比較次數實測
& §[sec:junit] & 兩種實作與 JUnit 5 黑箱測試
& §[sec:generics] & 泛型 、、Collections 導覽
& §[sec:hash] & 字串雜湊實驗、鏈結雜湊表、線性探測、 陷阱
& §[sec:ws6]、[sec:ws7] & 協定訊息解析器、Echo 伺服器/客戶端、 介面