本目錄收錄《Java 程式設計完整學習教材》中級篇 ch01〜ch08 的全部範例, 每個檔案開頭都註明出處章節,書中的中文教學註解逐字保留。

執行方式

  • 一般範例:在 code/ 目錄下用共用腳本執行:
cd code
./run.sh intermediate/ch01-encapsulation-inheritance BankAccountDemo
  • ch08 圖書管理系統(含套件的多檔專案):使用專案目錄內的專屬腳本:
cd intermediate/ch08-project-library-system
./compile.sh          # 編譯到 out/
./run.sh              # 編譯並啟動互動式選單
  • 故意編譯錯誤的教學範例:放在 ch01-encapsulation-inheritance/errors/, compile-all.sh 會自動跳過;請手動 javac 觀察錯誤訊息(這正是教學目的)。

補充說明:

  • 有些範例「執行時拋出例外」正是書中要示範的重點(詳見各章備註), 程式以非零狀態碼結束屬預期行為。
  • 含堆疊追蹤的範例(如 StackTraceDemo)輸出中的自家程式行號會比書中多 2〜4 行, 因為抽出檔開頭加了出處註解;函式庫內部行號書中亦說明會因 JDK 版本而異。
  • 書中凡需要穩定輸出處已刻意採用 LinkedHashSet/LinkedHashMap 或先排序再輸出, 因此本冊所有非互動範例的輸出皆可重現、與書中一致。

ch01 封裝與繼承(ch01-encapsulation-inheritance/)

檔案 內容說明 執行方式 備註
BankAccount.java 封裝完整示範:private 欄位+setter 驗證 配套類別,不單獨執行 1.1 節
BankAccountDemo.java 驗證封裝效果與非法操作被拒 ./run.sh intermediate/ch01-encapsulation-inheritance BankAccountDemo
Employee.java/Manager.java 繼承體系的父/子類別 配套類別 1.2 節
InheritanceDemo.java 子類別自動擁有父類別公開成員 ./run.sh ... InheritanceDemo
Car.java 組合(has-a)而非繼承:Car 持有 Engine 僅供編譯閱讀,無 main
SavingsAccount.java super 呼叫父類別建構子;繼承欄位須走 getter ./run.sh ... SavingsAccount 繼承同目錄的 BankAccount
OverrideTrap.java 拼錯方法名導致「覆寫沒發生」的安靜錯誤 ./run.sh ... OverrideTrap 1.4 節
errors/Cat.java 加上 @Override 後拼錯字變成編譯錯誤 於 errors/ 內手動 javac -encoding UTF-8 *.java 預期編譯失敗:method does not override...(errors/Animal.java 為配套類別)
InitOrder.java 完整初始化順序:靜態→實體→建構子 ./run.sh ... InitOrder 1.5 節
Book.java/BookDemo.java toString、equals、hashCode 標準覆寫範本與驗證 ./run.sh ... BookDemo 1.6 節
AuthToken.java final 類別與 final 方法(含 PaymentBase) 僅供編譯閱讀,無 main 1.7 節

ch02 多型、抽象類別與介面(ch02-polymorphism-abstract-interface/)

檔案 內容說明 執行方式 備註
PolymorphismDemo.java 向上轉型、動態繫結與多型陣列(含 Animal/Dog/Cat) ./run.sh intermediate/ch02-polymorphism-abstract-interface PolymorphismDemo 2.1 節
FieldBinding.java 欄位靜態繫結 vs 方法動態繫結 ./run.sh ... FieldBinding
CastingDemo.java 向下轉型與模式匹配 instanceof ./run.sh ... CastingDemo 沿用 PolymorphismDemo.java 中的 Animal/Dog/Cat
Shape.java 抽象類別 Shape 與 Circle、Rectangle 子類別 配套類別 2.3 節
ShapeDemo.java 多型陣列統一處理所有形狀 ./run.sh ... ShapeDemo
ComparableDemo.java 實作 Comparable 讓 Arrays.sort 排序自訂類別 ./run.sh ... ComparableDemo 2.4 節
AudioDemo.java 介面五種成員:常數、抽象、default、static、private ./run.sh ... AudioDemo
DiamondDemo.java 鑽石問題與「介面名.super.方法名」解法 ./run.sh ... DiamondDemo
CheckoutDemo.java 綜合範例:付款系統(策略模式雛形) ./run.sh ... CheckoutDemo 2.5 節

ch03 例外處理(ch03-exceptions/)

檔案 內容說明 執行方式 備註
ErrorCodeStyle.java 錯誤碼寫法的缺陷:印出荒謬的索引 -1 ./run.sh intermediate/ch03-exceptions ErrorCodeStyle 「錯誤結果」正是教學重點
TryCatchDemo.java 多重 catch 的比對順序 ./run.sh ... TryCatchDemo
MultiCatchDemo.java multi-catch 語法 ./run.sh ... MultiCatchDemo abc(或 0、4) 由內文片段補全;需帶一個命令列引數
FinallyDemo.java finally 與 return 的互動 ./run.sh ... FinallyDemo
TryWithResourcesDemo.java 自訂 AutoCloseable 資源、後進先出關閉 ./run.sh ... TryWithResourcesDemo
InvalidAmountException.java 自訂 unchecked 例外 配套類別 3.5 節
InsufficientFundsException.java 自訂 checked 例外(帶 shortage 欄位) 配套類別 3.5 節
ChainDemo.java 例外鏈:cause 保留因果 ./run.sh ... ChainDemo
StackTraceDemo.java 未捕獲例外的堆疊追蹤結構 ./run.sh ... StackTraceDemo 預期拋出 NumberFormatException(exit code 1);行號較書中 +2
Atm.java/AtmDemo.java 綜合範例:ATM 提款機 ./run.sh ... AtmDemo 使用上述兩個自訂例外

ch04 集合框架(ch04-collections/)

檔案 內容說明 執行方式 備註
BoxingTrap.java Integer 快取陷阱:== 與 equals ./run.sh intermediate/ch04-collections BoxingTrap
ArrayListBasics.java ArrayList 常用操作總覽 ./run.sh ... ArrayListBasics
LinkedListDequeDemo.java LinkedList 當雙端佇列 ./run.sh ... LinkedListDequeDemo 由內文片段補全
TraversalDemo.java 四種走訪方式 ./run.sh ... TraversalDemo
BrokenRemoval.java for-each 中直接刪除元素的錯誤示範 ./run.sh ... BrokenRemoval 預期拋出 ConcurrentModificationException(exit code 1);行號較書中 +4
RemoveWhileIterating.java 走訪中刪除的兩種正解 ./run.sh ... RemoveWhileIterating
HashSetDemo.java equals/hashCode 契約與 Set 去重(含 Member) ./run.sh ... HashSetDemo 書中用 LinkedHashSet 讓輸出穩定
SetOrderDemo.java Hash/LinkedHash/Tree 三種 Set 順序比較 ./run.sh ... SetOrderDemo HashSet 不保證順序,書中僅印元素個數
MapBasics.java Map 常用操作與 merge ./run.sh ... MapBasics 書中用 LinkedHashMap 讓輸出穩定
MapTraversal.java Map 的三種走訪 ./run.sh ... MapTraversal
SortingDemo.java Comparator+lambda 排序(含 Student) ./run.sh ... SortingDemo
CollectionsDemo.java Collections 工具方法 ./run.sh ... CollectionsDemo
WordFrequency.java 綜合範例:單字頻率統計前三名 ./run.sh ... WordFrequency HashMap 計數後有排序,輸出可重現

ch05 泛型(ch05-generics/)

檔案 內容說明 執行方式 備註
RawTypeDanger.java raw type 的執行期炸彈 ./run.sh intermediate/ch05-generics RawTypeDanger 預期拋出 ClassCastException(exit code 1);編譯有 unchecked 警告屬正常;行號較書中 +4
Box.java 泛型類別 Box\<T> 與 Pair\<K, V> 配套類別 5.2 節
BoxDemo.java 使用泛型類別 ./run.sh ... BoxDemo
GenericMethodDemo.java 泛型方法與型別推斷 ./run.sh ... GenericMethodDemo
BoundedTypeDemo.java 有界型別參數 extends Comparable ./run.sh ... BoundedTypeDemo
WildcardDemo.java 三種萬用字元:?、? extends、? super ./run.sh ... WildcardDemo
PecsCopyDemo.java PECS 原則的 copy 方法 ./run.sh ... PecsCopyDemo 由內文片段補全
CovarianceDemo.java 陣列協變 vs 泛型不變(ArrayStoreException 被捕獲) ./run.sh ... CovarianceDemo 例外有 catch,正常結束
ErasureDemo.java 型別抹除的可觀察證據 ./run.sh ... ErasureDemo
GenericStack.java/GenericStackDemo.java 綜合範例:型別安全的泛型堆疊 ./run.sh ... GenericStackDemo

ch06 檔案與 I/O(ch06-file-io/)

本章所有範例依書中寫法自行建立測試檔、結尾自行刪除, 正常執行完不會留下任何檔案;下表列出執行過程中暫時產生的檔案。 由於 code/run.sh 以 code/ 為工作目錄,暫存檔會出現在 code/ 下並隨即被刪除。

檔案 內容說明 執行方式 執行時暫時產生
FileInfoDemo.java File 與 Path/Files 兩代 API 對照 ./run.sh intermediate/ch06-file-io FileInfoDemo demo.txt
FileCopyDemo.java 位元組流+緩衝區複製檔案 ./run.sh ... FileCopyDemo source.bin、target.bin
TextFileDemo.java 字元流讀寫 UTF-8 文字檔 ./run.sh ... TextFileDemo notes.txt
FilesToolboxDemo.java Files 工具方法:readString、copy 等 ./run.sh ... FilesToolboxDemo todo.txt、todo-backup.txt
ListDirDemo.java Files.list 走訪目錄 ./run.sh ... ListDirDemo data-dir/(內含 3 檔)
SerializationDemo.java 物件序列化與 transient(含 Profile) ./run.sh ... SerializationDemo profile.ser
GradeReport.java 綜合範例:CSV 成績檔處理 ./run.sh ... GradeReport scores.csv、report.txt(CSV 由程式「步驟零」依書中內容產生)

ch07 列舉、內部類別與常用 API(ch07-enums-inner-classes-api/)

檔案 內容說明 執行方式 備註
EnumBasicsDemo.java enum 宣告、內建方法與 switch(含 Weekday) ./run.sh intermediate/ch07-enums-inner-classes-api EnumBasicsDemo 7.1 節
PlanetDemo.java 帶欄位與方法的列舉:行星表面重力 ./run.sh ... PlanetDemo
OperationDemo.java 每個常數各自實作抽象方法 ./run.sh ... OperationDemo
EnumCollectionsDemo.java EnumSet 與 EnumMap ./run.sh ... EnumCollectionsDemo 使用 EnumBasicsDemo.java 中的 Weekday
NestedDemo.java 四種巢狀類別最小示範(含 Greeter) ./run.sh ... NestedDemo
AnonymousComparatorDemo.java 匿名類別實作 Comparator ./run.sh ... AnonymousComparatorDemo
MathRandomDemo.java Math 方法與範圍亂數公式 ./run.sh ... MathRandomDemo 亂數僅印一萬次極值(最小 1、最大 6),輸出穩定
TimeDemo.java java.time 建立、計算、格式化、解析 ./run.sh ... TimeDemo 使用固定日期,輸出可重現
Order.java 綜合範例:enum 狀態機+內部類別+時間 ./run.sh ... Order 7.7 節

ch08 圖書管理系統(ch08-project-library-system/)

含套件的多檔專案(model/exception/repository/service/app 五層), 源碼位於 src/library/ 下依套件擺放,共 12 個 .java:

套件 檔案
library.model Book.java、Member.java、Loan.java
library.exception LibraryException.java、BookNotAvailableException.java、MemberNotFoundException.java、LoanLimitExceededException.java
library.repository LibraryRepository.java、InMemoryLibraryRepository.java、FileLibraryRepository.java
library.service LibraryService.java
library.app LibraryApp.java(主類別 library.app.LibraryApp)

執行方式(互動式選單程式):

cd ch08-project-library-system
./run.sh        # 內部先執行 compile.sh 再啟動

備註:

  • 編譯產物放在專案的 out/(compile.sh 每次重建;不納入版本控制)。
  • 選單選 [6] 存檔 會在專案目錄產生 books.txt(一本書一行、欄位以 | 分隔), 下次啟動可自行在 seedData() 後呼叫 repo.load() 載回。
  • 教學用「營業日」固定為 2026-08-14,因此借書的應還日期固定為 2026-08-28,輸出可重現。
  • 已依書中 8.8 節的完整輸入序列驗證:訊息與書中一致 (書中提示文字後緊接的內容是使用者輸入的回顯,以管線餵入時不會出現)。

未抽出片段

(無)本冊三個內文片段——ch03 multi-catch、ch04 LinkedList 雙端佇列、 ch05 PECS copy——皆已補全為可執行檔,檔頭均註明「本檔由內文片段整理而成」。