面對龐大的 Java 技術體系,初學者常陷入「工具選擇癱瘓」「概念霧裡看花」「環境配置挫折」三大困境。本文整理自資深開發者實戰經驗,以 FAQ 形式系統解答 61 個核心問題,涵蓋環境建置、基礎語法、物件導向、集合框架、I/O 處理、執行緒等關鍵領域,為您鋪設一條清晰、可落地的 Java 學習路徑。
階段 1(必經):JDK + 文字編輯器 + 命令列 — 強制理解 path、classpath、package、javac/java 核心機制
階段 2(進階):IDE — 推薦 Eclipse(免費開源、社群強)或 IntelliJ IDEA Community(體驗佳),不建議 直接上 JCreator/Visual J++ 等舊工具
無絕對優劣,看場景:高效能、系統級、遊戲引擎、嵌入式 → C++;企業級應用、雲原生、微服務、跨平台、團隊協作、快速迭代 → Java
javac HelloWorld.java → 產生 HelloWorld.class
java HelloWorld → 執行(注意:不加 .class)
| 錯誤訊息 | 原因 | 解決方案 |
|---|---|---|
| 'javac' 不是內部命令 | PATH 未配置 JDK bin 目錄 | 設 JAVA_HOME,PATH 加 %JAVA_HOME%\bin |
| NoClassDefFoundError | CLASSPATH 缺少當前目錄 (.) | CLASSPATH 加入 . 或用 -cp . 指定 |
| NoSuchMethodError: main | main 方法簽名錯誤/類名不匹配 | 檢查 public static void main(String[] args)、檔名=類名、大小寫一致 |
| deprecated API | 使用已淘汰方法 | 查 API 文件改用新替代方法 |
com.example.util.StringUtils → src/com/example/util/StringUtils.javajavac com/example/util/StringUtils.javaBufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line = in.readLine(); // 讀字串
int n = Integer.parseInt(line); // 轉整數
double d = Double.parseDouble(line); // 轉浮點數
// 讀取
BufferedReader fin = new BufferedReader(new FileReader("input.txt"));
// 寫入
PrintWriter fout = new PrintWriter(new FileWriter("output.txt"));
System.in/out 為位元組流,處理中文必須包裝為字元流RandomAccessFileread() 回傳 -1,readLine() 回傳 null| 關鍵字 | 用途 | 關鍵規則 |
|---|---|---|
| final | 常數/不可覆寫/不可繼承 | 變數只能賦值一次;方法不可 override;類不可 extends |
| static | 類層級成員 | 無需實例即可呼叫;所有實例共享唯一副本 |
| abstract | 抽象類/方法 | 含 abstract 方法的類必須宣告 abstract;不可實例化 |
| interface | 契約定義 | Java 8 起支援 default/static 方法;實作用 implements |
| throws/throw | 異常聲明/拋出 | throws 在簽名;throw 在方法體;RuntimeException 可不聲明 |
| transient | 序列化排除 | 標記欄位不參與序列化 |
| volatile | 執行緒可見性 | 禁止指令重排、保證讀寫直接作用於主記憶體 |
goto、const、宏、運算子多載、手動記憶體管理、多重繼承break/continue label、final 常數、介面預設方法、GC 自動回收extends:單繼承類別(is-a 關係)implements:實作多個介面(can-do 契約)super(...) 或 this(...)finalize() 非析構函數,GC 不可預期,極少使用if (obj instanceof TargetType) {
TargetType target = (TargetType) obj; // 安全下轉型
}
Java 唯有傳值呼叫。物件傳遞的是「參考的副本」,修改物件內部狀態有效,重新指派參考無效。
| 需求 | 介面 | 實作類別 | 特性 |
|---|---|---|---|
| 動態陣列、隨機存取 | List | ArrayList | 查詢快、增刪慢、非執行緒安全 |
| 頻繁頭尾增刪 | List/Deque | LinkedList | 增刪快、查詢慢、佔記憶體大 |
| 無重複、無序 | Set | HashSet | O(1) 查找、無序 |
| 無重複、有序 | Set | TreeSet | O(log n)、紅黑樹、需實作 Comparable |
| 鍵值對、快速查找 | Map | HashMap | O(1)、允許 null key/value |
| 鍵值對、有序 | Map | TreeMap/LinkedHashMap | 依鍵排序/插入順序 |
Arrays.sort(arr) / Arrays.sort(arr, comparator)for (E e : collection) 或 Iterator(需邊遍歷邊刪除時)new Random().nextInt(bound)equals(),絕不用 ==Java 學習是場馬拉松,非百米衝刺。夯實基礎、養成習慣、持續實作,您一定能跨過新手期,成為優秀的 Java 工程師!