本目錄收錄《Java 程式設計完整學習教材》中級篇 ch01〜ch08 的全部範例,
每個檔案開頭都註明出處章節,書中的中文教學註解逐字保留。
執行方式
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——皆已補全為可執行檔,檔頭均註明「本檔由內文片段整理而成」。