Java 是語言規範;JDK (Java Development Kit) 是開發工具包,含編譯器、JRE、類庫;JRE (Java Runtime Environment) 是執行環境。JDK 1.0~1.1 稱 JDK,1.2~1.4 稱 J2SDK (J2SE),1.5 起更名 Java 5 (JDK 5),內部版本號仍為 1.5。JDK 9 後採用時間發布制 (JDK 11, 17, 21 LTS)。
裝 JRE 即可。**IE/Edge/Chrome 早已移除 NPAPI 外掛支援,Applet 技術徹底淘汰**,現代 Web 請用 Java Web Start (已移除) 或轉為 Spring Boot + 前端分離架構。
**階段 1 (2 週)**:JDK + VS Code (Extension Pack for Java) / Notepad++,手寫 javac/java、理解 CLASSPATH、package 目錄對應。
**階段 2**:IntelliJ IDEA Community (免費、功能強)、Eclipse、NetBeans 三選一。JCreator、BlueJ 已過時不建議。
英文文檔閱讀能力是核心競爭力,API 文檔、StackOverflow、GitHub Issue 皆為英文。
**選 C++**:高頻交易、遊戲引擎、嵌入式、極致效能、需手動記憶體管理。
**選 Java**:企業級應用、微服務、Android (早期)、大數據 (Hadoop/Spark/Flink)、團隊協作、跨平台、開發效率優先。
**核心差異**:Java 有 GC、無指標、單繼承+介面、執行期反射、生態標準化 (Maven Central)。
| 錯誤 | 原因 | 解決 |
|---|---|---|
| 'javac' 不是內部命令 | PATH 未含 %JAVA_HOME%\bin | 設定 PATH,重開終端機 |
| NoClassDefFoundError | CLASSPATH 缺 . (當前目錄) 或包結構錯誤 | 加 .;確保 java com.pkg.Main 在源碼根目錄執行 |
| NoSuchMethodError: main | main 簽名錯誤、類非 public、檔名不符 | public static void main(String[] args),檔名=類名 |
package com.app.module; 對應目錄 com/app/module/。import com.app.module.User; (單類) 或 import com.app.module.*; (包內所有類)。同名類用全限定名區分。javac com/app/module/User.java → java com.app.module.User。JDK 僅產出跨平台 .class 位元碼。GraalVM native-image 可編譯原生執行檔 (啟動極快、無 JIT 預熱),但反射/動態代理需額外配置。**除非有極致啟動速度/體積需求,否則堅持跨平台優勢,不建議打包 exe。**
標註 @Deprecated(since="1.9", forRemoval=true) 表示未來版本移除。查 API 文檔替代方案 (如 Date → LocalDateTime、Vector → ArrayList),逐步遷移,編譯加 -Xlint:deprecation 定位。
public static void main(String[] args) {
// java MyApp -env prod -port 8080
// args = ["-env", "prod", "-port", "8080"]
// 建議用 picocli / Spring Boot 解析
}
// 輸入 (含中文)
try (BufferedReader in = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8))) {
String line = in.readLine();
int n = Integer.parseInt(line.trim());
}
// 輸出
try (PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true)) {
out.println("Result: " + n);
}
// 檔案複製 (NIO 高效)
Files.copy(Paths.get("src.txt"), Paths.get("dst.txt"), StandardCopyOption.REPLACE_EXISTING);
RandomAccessFile 支援 seek() 隨機讀寫。Reader.read() 回傳 -1 表示 EOF;readLine() 回傳 null。static final 常量或註解處理器 (Lombok/MapStruct)。final 三重義:變量不可改、方法不可覆寫、類不可繼承。const/goto 保留字未用。goto,用標籤 break outer; / continue outer; 跳出多層迴圈。String + 是編譯器語法糖 (底層 StringBuilder)。delete,GC 自動回收。避免記憶體洩漏:釋放資源用 try-with-resources、清空集合引用、弱引用快取。main 為何 public static?public:JVM 啟動器需從外部呼叫。static:無需實例化即可進入,屬於類而非物件。ClassName.main(args) 直接呼叫。java.time、預設方法、CompletableFuture。var、HTTP Client、GC 改良 (G1 預設)。建議:生產環境鎖定 **LTS 版本 (17 或 21)**,享受長期安全更新與生態相容性。