首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 核心概念 FAQ:新手最易踩的 30 個坑與最佳實踐

     編輯:Java 相關知識

基礎認知篇

Q1: Java、Java 2、JDK、JRE 怎麼區分?版本號為什麼這樣跳?

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)。

Q2: 只跑程式要裝什麼?瀏覽器能跑 Applet 嗎?

裝 JRE 即可。**IE/Edge/Chrome 早已移除 NPAPI 外掛支援,Applet 技術徹底淘汰**,現代 Web 請用 Java Web Start (已移除) 或轉為 Spring Boot + 前端分離架構。

Q3: 新手該用什麼工具?

**階段 1 (2 週)**:JDK + VS Code (Extension Pack for Java) / Notepad++,手寫 javac/java、理解 CLASSPATH、package 目錄對應。
**階段 2**:IntelliJ IDEA Community (免費、功能強)、Eclipse、NetBeans 三選一。JCreator、BlueJ 已過時不建議。

Q4: 必讀書籍推薦?

  1. 入門:《Java 核心技術 卷 I》—— Cay Horstmann
  2. 進階:《Effective Java 第 3 版》—— Joshua Bloch (必讀 3 遍)
  3. JVM:《深入理解 Java 虛擬機器》—— 周志明
  4. 併發:《Java Concurrency in Practice》—— Brian Goetz

英文文檔閱讀能力是核心競爭力,API 文檔、StackOverflow、GitHub Issue 皆為英文。

Q5: Java vs C++ 怎麼選?

**選 C++**:高頻交易、遊戲引擎、嵌入式、極致效能、需手動記憶體管理。
**選 Java**:企業級應用、微服務、Android (早期)、大數據 (Hadoop/Spark/Flink)、團隊協作、跨平台、開發效率優先。
**核心差異**:Java 有 GC、無指標、單繼承+介面、執行期反射、生態標準化 (Maven Central)。

Q6: J2SE / J2EE / J2ME 是什麼?

  • J2SE (Java SE):標準版,桌面/伺服器核心 API。
  • J2EE (Java EE / Jakarta EE):企業版規範 (Servlet, JPA, CDI, JAX-RS…),由應用伺服器 (Tomcat, WildFly) 實作。
  • J2ME (Java ME):嵌入式/功能機精簡版,已被 Android/iOS 取代。

命令列與建構篇

Q7-Q11: 編譯/執行常見錯誤

錯誤原因解決
'javac' 不是內部命令PATH 未含 %JAVA_HOME%\bin設定 PATH,重開終端機
NoClassDefFoundErrorCLASSPATH 缺 . (當前目錄) 或包結構錯誤加 .;確保 java com.pkg.Main 在源碼根目錄執行
NoSuchMethodError: mainmain 簽名錯誤、類非 public、檔名不符public static void main(String[] args),檔名=類名

Q12-Q15: Package 與 Import 實戰

  • Package:邏輯分組 + 命名空間隔離。package com.app.module; 對應目錄 com/app/module/。
  • Import:import com.app.module.User; (單類) 或 import com.app.module.*; (包內所有類)。同名類用全限定名區分。
  • 無 Package:置於 無名包,僅適合測試小程式,專案嚴禁。
  • 編譯/執行帶包類別:在源碼根目錄 javac com/app/module/User.java → java com.app.module.User。

Q16: 能編譯成 .exe 嗎?

JDK 僅產出跨平台 .class 位元碼。GraalVM native-image 可編譯原生執行檔 (啟動極快、無 JIT 預熱),但反射/動態代理需額外配置。**除非有極致啟動速度/體積需求,否則堅持跨平台優勢,不建議打包 exe。**

Q17: Deprecated API 警告怎麼辦?

標註 @Deprecated(since="1.9", forRemoval=true) 表示未來版本移除。查 API 文檔替代方案 (如 Date → LocalDateTime、Vector → ArrayList),逐步遷移,編譯加 -Xlint:deprecation 定位。

IO 與參數篇

Q18: 如何傳遞啟動參數?

public static void main(String[] args) {
    // java MyApp -env prod -port 8080
    // args = ["-env", "prod", "-port", "8080"]
    // 建議用 picocli / Spring Boot 解析
}

Q19-Q21: 鍵盤/螢幕/檔案 IO 模板

// 輸入 (含中文)
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);

Q22-Q24: 隨機存取、檢測結尾

  • RandomAccessFile 支援 seek() 隨機讀寫。
  • Reader.read() 回傳 -1 表示 EOF;readLine() 回傳 null。

關鍵字與語言特性篇

Q25: 無巨集?用 static final 常量或註解處理器 (Lombok/MapStruct)。

Q26: final 三重義:變量不可改、方法不可覆寫、類不可繼承。const/goto 保留字未用。

Q27: 無 goto,用標籤 break outer; / continue outer; 跳出多層迴圈。

Q28: 無運算子多載,String + 是編譯器語法糖 (底層 StringBuilder)。

Q29: 無 delete,GC 自動回收。避免記憶體洩漏:釋放資源用 try-with-resources、清空集合引用、弱引用快取。

Q30: main 為何 public static?

  • public:JVM 啟動器需從外部呼叫。
  • static:無需實例化即可進入,屬於類而非物件。ClassName.main(args) 直接呼叫。

進階補充:現代 Java 新特性速覽

  • Java 8:Lambda、Stream、Optional、java.time、預設方法、CompletableFuture。
  • Java 9-11:模組系統 (JPMS)、JShell、var、HTTP Client、GC 改良 (G1 預設)。
  • Java 17 LTS:Sealed Class、Record、Pattern Matching、強封裝 JDK 內部 API、ZGC/Shenandoah 生產就緒。
  • Java 21 LTS:Virtual Threads (Project Loom)、Structured Concurrency、Pattern Matching for switch、String Templates (Preview)、Generational ZGC。

建議:生產環境鎖定 **LTS 版本 (17 或 21)**,享受長期安全更新與生態相容性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved