本目錄收錄《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 程式,不在抽取範圍。