本目錄收錄《Java 程式設計完整學習教材》初級篇第 1〜8 章的全部範例程式,
每章一個目錄(與 .tex 檔名一致),每個檔案都可獨立編譯執行,並逐字保留
書中的繁體中文教學註解。每個檔案第一行的「出處」註解標明對應章節。
執行方式
最方便的方式是使用上層 code/ 目錄的 run.sh(會自動編譯到暫存目錄再執行,
不會留下 .class 檔):
cd java-textbook/code
./run.sh beginner/ch01-getting-started HelloWorld # ./run.sh <章節目錄> <主類別名>
./run.sh beginner/ch05-arrays GradeStats
也可以手動編譯執行單一章節:
cd java-textbook/code/beginner/ch03-operators
javac -encoding UTF-8 -d /tmp/out ./*.java && java -cp /tmp/out ArithmeticDemo
通用注意事項:
- 互動式範例(使用 Scanner):執行後依提示輸入即可。下表備註欄附上 書中示範的輸入,也可以直接用管線餵入,例如:
printf "小明\n18\n1.72\n" | ./run.sh beginner/ch02-variables-and-types ScannerDemo
- errors/ 子目錄:故意無法通過編譯的教學範例,
compile-all.sh會自動 跳過。請手動javac觀察錯誤訊息(這正是教學目的),例如:
cd beginner/ch01-getting-started/errors && javac MissingSemicolon.java
- 行號差 1:每個檔案最上方比書中列表多一行「出處」註解,因此凡輸出會 標示原始碼行號的範例(errors/ 的編譯錯誤、執行期例外的堆疊),實際行號 會比書中大 1,其餘訊息文字完全一致。
- 預期會「當掉」的範例:
DivideByZero、IndexError、ParseDemo、NullPointerDemo是教學用的執行期例外示範,執行到最後拋出例外、 結束碼為 1 是書中預期的正確行為。
第 1 章 認識 Java 與建置開發環境(ch01-getting-started)
執行:./run.sh beginner/ch01-getting-started <主類別>
| 檔案 | 內容說明 | 執行方式 | 備註 |
|---|---|---|---|
HelloWorld.java |
第一個 Java 程式,印出問候訊息(1.4 節) | run.sh 代入 HelloWorld |
|
SelfIntroduction.java |
println 與 print 的差別(1.4 節) | run.sh 代入 SelfIntroduction |
|
CommentDemo.java |
三種註解:單行、多行、Javadoc(1.5 節) | run.sh 代入 CommentDemo |
|
errors/MissingSemicolon.java |
教學用編譯錯誤:漏寫分號(1.6 節) | 手動 javac MissingSemicolon.java |
預期錯誤:error: ';' expected(書中指第 7 行,本檔因出處註解為第 8 行) |
errors/WrongCase.java |
教學用編譯錯誤:System 寫成 system(1.6 節) | 手動 javac WrongCase.java |
預期錯誤:error: package system does not exist(書中第 6 行,本檔為第 7 行) |
第 2 章 變數與資料型別(ch02-variables-and-types)
執行:./run.sh beginner/ch02-variables-and-types <主類別>
| 檔案 | 內容說明 | 執行方式 | 備註 |
|---|---|---|---|
VariableBasics.java |
變數宣告、初始化與重新指定(2.1 節) | run.sh 代入 VariableBasics |
|
IntegerLiterals.java |
整數字面值:底線、L 後綴、二/十六進位(2.3 節) | run.sh 代入 IntegerLiterals |
|
FloatingPointDemo.java |
double 與 float 的精度差異(2.3 節) | run.sh 代入 FloatingPointDemo |
|
CharDemo.java |
char 與 Unicode 編號、字元運算(2.3 節) | run.sh 代入 CharDemo |
|
BooleanDemo.java |
boolean 與比較運算結果(2.3 節) | run.sh 代入 BooleanDemo |
|
WideningDemo.java |
自動型別提升(2.4 節) | run.sh 代入 WideningDemo |
|
NarrowingDemo.java |
窄化轉型:截斷與溢位(2.4 節) | run.sh 代入 NarrowingDemo |
|
FinalDemo.java |
final 常數與命名慣例(2.5 節) | run.sh 代入 FinalDemo |
|
VarDemo.java |
var 區域變數型別推斷(2.6 節) | run.sh 代入 VarDemo |
|
ScannerDemo.java |
Scanner 讀取姓名、年齡、身高(2.8 節) | 互動式;書中輸入依序為 小明、18、1.72 |
可用 printf "小明\n18\n1.72\n" 管線餵入 |
第 3 章 運算子與運算式(ch03-operators)
執行:./run.sh beginner/ch03-operators <主類別>
| 檔案 | 內容說明 | 執行方式 | 備註 |
|---|---|---|---|
ArithmeticDemo.java |
五個算術運算子與整數除法(3.1 節) | run.sh 代入 ArithmeticDemo |
|
DivideByZero.java |
整數與浮點數除以零的不同下場(3.1 節) | run.sh 代入 DivideByZero |
預期最後拋出 ArithmeticException: / by zero(堆疊行號 13,書中 12) |
IncrementDemo.java |
後置 i++ 與前置 ++i(3.2 節) | run.sh 代入 IncrementDemo |
|
CompoundAssignDemo.java |
複合指定運算子(3.3 節) | run.sh 代入 CompoundAssignDemo |
|
ComparisonDemo.java |
比較運算子(3.4 節) | run.sh 代入 ComparisonDemo |
|
ShortCircuitDemo.java |
&& 與 || 的短路求值證明(3.5 節) | run.sh 代入 ShortCircuitDemo |
|
BitwiseDemo.java |
位元運算子速覽(3.6 節) | run.sh 代入 BitwiseDemo |
|
TernaryDemo.java |
三元運算子(3.7 節) | run.sh 代入 TernaryDemo |
|
ConcatTrap.java |
加號的字串串接陷阱(3.8 節) | run.sh 代入 ConcatTrap |
|
PrecisionDemo.java |
0.1 + 0.2 的浮點誤差與比較法(3.10 節) | run.sh 代入 PrecisionDemo |
|
BigDecimalDemo.java |
BigDecimal 十進位精確計算(3.10 節) | run.sh 代入 BigDecimalDemo |
|
BmiCalculator.java |
綜合範例:BMI 計算機(3.11 節) | 互動式;書中輸入依序為 1.7、65 |
可用 printf "1.7\n65\n" 管線餵入 |
第 4 章 流程控制(ch04-control-flow)
執行:./run.sh beginner/ch04-control-flow <主類別>
| 檔案 | 內容說明 | 執行方式 | 備註 |
|---|---|---|---|
GradeDemo.java |
if/else if 多路分支:成績等第(4.1 節) | run.sh 代入 GradeDemo |
|
GuardClauseDemo.java |
巢狀 if 與衛述句對比(4.1 節) | run.sh 代入 GuardClauseDemo |
|
SwitchFallThrough.java |
傳統 switch 故意漏 break 的落穿示範(4.2 節) | run.sh 代入 SwitchFallThrough |
可正常編譯執行;「錯誤」指行為非預期,正是教學重點 |
SwitchArrowDemo.java |
箭頭語法:敘述、運算式、yield(4.2 節) | run.sh 代入 SwitchArrowDemo |
|
ReverseNumber.java |
while 迴圈:數字反轉(4.3 節) | run.sh 代入 ReverseNumber |
|
InputValidation.java |
do-while 輸入驗證(4.4 節) | 互動式;書中輸入依序為 9、0、3 |
可用 printf "9\n0\n3\n" 管線餵入 |
ForSum.java |
for 迴圈:1 加到 100(4.5 節) | run.sh 代入 ForSum |
|
MultiplicationTable.java |
巢狀迴圈:九九乘法表(4.6 節) | run.sh 代入 MultiplicationTable |
|
BreakContinueDemo.java |
break 與 continue(4.7 節) | run.sh 代入 BreakContinueDemo |
|
LabelBreakDemo.java |
標籤 break 一次跳出多層(4.7 節) | run.sh 代入 LabelBreakDemo |
|
GuessNumber.java |
綜合範例:猜數字遊戲(4.8 節) | 互動式;反覆輸入 1〜100 的猜測 | 答案隨機,每次執行輸出不同;書中示範答案恰為 58 |
第 5 章 陣列(ch05-arrays)
執行:./run.sh beginner/ch05-arrays <主類別>
| 檔案 | 內容說明 | 執行方式 | 備註 |
|---|---|---|---|
ArrayBasics.java |
陣列兩種建立方式與索引存取(5.1 節) | run.sh 代入 ArrayBasics |
|
IndexError.java |
索引越界的執行期例外示範(5.1 節) | run.sh 代入 IndexError |
預期拋出 ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3(堆疊行號 10,書中 9) |
TraverseDemo.java |
傳統 for 與增強式 for 走訪(5.2 節) | run.sh 代入 TraverseDemo |
|
ArrayReference.java |
陣列是參考型別;正確複製方式(5.3 節) | run.sh 代入 ArrayReference |
|
MaxMinAverage.java |
一趟走訪找極值、總和與平均(5.4 節) | run.sh 代入 MaxMinAverage |
|
ReverseAndSearch.java |
就地反轉與線性搜尋(5.4 節) | run.sh 代入 ReverseAndSearch |
|
ArraysUtil.java |
Arrays 工具類別常用方法(5.5 節) | run.sh 代入 ArraysUtil |
|
TwoDimensional.java |
二維陣列成績表(5.6 節) | run.sh 代入 TwoDimensional |
|
JaggedArray.java |
不規則陣列(5.6 節) | run.sh 代入 JaggedArray |
每行輸出結尾有一個空白(print(value + " ") 所致),書面稿看不出來 |
GradeStats.java |
綜合範例:成績統計程式(5.7 節) | run.sh 代入 GradeStats |
第 6 章 方法(ch06-methods)
執行:./run.sh beginner/ch06-methods <主類別>
| 檔案 | 內容說明 | 執行方式 | 備註 |
|---|---|---|---|
RepeatPain.java |
反面教材:重複的程式碼(6.1 節) | run.sh 代入 RepeatPain |
|
LinePrinter.java |
用方法消除重複(6.1 節) | run.sh 代入 LinePrinter |
|
AreaCalculator.java |
參數、引數、回傳值與提早 return(6.2 節) | run.sh 代入 AreaCalculator |
|
PassByValue.java |
傳值呼叫:交換失敗與修改陣列成功(6.3 節) | run.sh 代入 PassByValue |
|
OverloadDemo.java |
方法多載(6.4 節) | run.sh 代入 OverloadDemo |
|
VarargsDemo.java |
可變參數 varargs(6.5 節) | run.sh 代入 VarargsDemo |
|
Factorial.java |
遞迴:階乘(6.6 節) | run.sh 代入 Factorial |
|
Fibonacci.java |
遞迴:費氏數列前 10 項(6.6 節) | run.sh 代入 Fibonacci |
輸出行尾有一個空白(print(fib(i) + " ") 所致) |
ScopeDemo.java |
變數作用域(6.7 節) | run.sh 代入 ScopeDemo |
|
CalculatorV2.java |
綜合範例:重構簡易計算機(6.8 節) | 互動式;書中輸入依序為 12、5 |
可用 printf "12\n5\n" 管線餵入 |
第 7 章 字串處理(ch07-strings)
執行:./run.sh beginner/ch07-strings <主類別>
| 檔案 | 內容說明 | 執行方式 | 備註 |
|---|---|---|---|
ImmutableDemo.java |
字串不可變性(7.1 節) | run.sh 代入 ImmutableDemo |
|
EqualsDemo.java |
== 與 equals 的差異、compareTo(7.2 節) | run.sh 代入 EqualsDemo |
|
InspectDemo.java |
查詢類方法:length、substring、indexOf 等(7.3 節) | run.sh 代入 InspectDemo |
|
TransformDemo.java |
加工類方法:trim、replace、split、join 等(7.3 節) | run.sh 代入 TransformDemo |
|
VowelCounter.java |
逐字元走訪:統計母音(7.3 節) | run.sh 代入 VowelCounter |
|
ParseDemo.java |
字串與數字互轉;轉換失敗的例外(7.4 節) | run.sh 代入 ParseDemo |
預期最後拋出 NumberFormatException: For input string: "abc"(本檔堆疊行號 17,書中 16;中段 Integer.java 行號與框架數依 JDK 版本而異,書中已註明) |
BuilderDemo.java |
StringBuilder 基本操作(7.5 節) | run.sh 代入 BuilderDemo |
|
ConcatPerformance.java |
String 串接與 StringBuilder 效能對決(7.5 節) | run.sh 代入 ConcatPerformance |
耗時數字依機器而異(書中已註明),量級差距一致 |
FormatDemo.java |
String.format 與 printf 格式化(7.6 節) | run.sh 代入 FormatDemo |
|
TextBlockDemo.java |
文字區塊(Java 15+)(7.6 節) | run.sh 代入 TextBlockDemo |
|
TextAnalyzer.java |
綜合範例:文字分析器(7.7 節) | run.sh 代入 TextAnalyzer |
第 8 章 物件導向入門(ch08-oop-basics)
執行:./run.sh beginner/ch08-oop-basics <主類別>
| 檔案 | 內容說明 | 執行方式 | 備註 |
|---|---|---|---|
ProceduralPain.java |
反面教材:沒有物件的平行變數(8.1 節) | run.sh 代入 ProceduralPain |
|
Student.java |
學生類別(設計圖,無 main)(8.2 節) | 無(由 StudentDemo 使用) |
與 StudentDemo.java 為同一範例的兩個檔案 |
StudentDemo.java |
建立與操作 Student 物件(8.2 節) | run.sh 代入 StudentDemo |
|
DefaultValueDemo.java |
欄位的預設值(8.2 節) | run.sh 代入 DefaultValueDemo |
|
NullPointerDemo.java |
對 null 呼叫方法的例外示範(8.2 節) | run.sh 代入 NullPointerDemo |
預期拋出 NullPointerException: Cannot invoke "String.length()" ...(堆疊行號 12,書中 11) |
Point.java |
建構子多載與 this 的兩種用法(8.3 節) | run.sh 代入 Point |
|
EncapsulationDemo.java |
封裝:private 欄位與驗證 setter(8.4 節) | run.sh 代入 EncapsulationDemo |
檔內含非 public 的 Player 類別 |
StaticDemo.java |
static 欄位:共用計數器(8.5 節) | run.sh 代入 StaticDemo |
檔內含非 public 的 Visitor 類別 |
MathDemo.java |
Math 類別的靜態方法(8.5 節) | run.sh 代入 MathDemo |
|
StaticError.java |
靜態方法存取實體成員的正確繞法(8.5 節) | run.sh 代入 StaticError |
名稱雖有 Error,但錯誤示範行已註解,可正常編譯執行(輸出 小明),故不放 errors/ |
HelloPackage.java |
套件宣告與 import(8.6 節) | run.sh 代入 com.example.school.HelloPackage |
有 package 宣告,執行需用全名 |
BankDemo.java |
綜合範例:BankAccount 銀行帳戶(8.7 節) | run.sh 代入 BankDemo |
檔內含非 public 的 BankAccount 類別 |
未抽出片段
無。初級篇 8 章的 81 個 javacode 程式列表全數為完整可編譯的類別,已全部
抽出成獨立檔案;內文其餘程式碼皆為單行的行內語法示意(如 int age;、
s.length()),不構成可獨立成檔的片段。另外書中 consoleoutput 區塊內的
終端機指令(如 brew install、javac/java 操作示範)屬安裝與操作說明,
非 Java 程式,不在抽取範圍。