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

Java 新手完整入門指南:環境建置、核心語法、常見問題彙整

     編輯:Java 相關知識

前言

Java 學習曲線陡峭,初學者常卡在環境變數、CLASSPATH、編譯執行、API 文件查找等基礎建置上。本文整理從 HelloWorld 到進階除錯的完整知識地圖,涵蓋環境配置、開發工具、核心語法、資料結構、I/O、網路、系統整合等實務主題,並附上常見錯誤解決方案。

第一階段:環境建置與 HelloWorld

JDK 安裝與路徑設定

  1. 下載 JDK (建議 LTS 版本:8, 11, 17, 21) → jdk.java.net 或 Adoptium
  2. 安裝路徑範例:C:\Java\jdk-21
  3. 設定環境變數 (Windows):
    • JAVA_HOME=C:\Java\jdk-21
    • PATH=%JAVA_HOME%\bin;%PATH% (置於最前)
    • ⚠️ CLASSPATH 不建議設定系統變數,由 IDE/建構工具/命令列參數控制
  4. 驗證:java -version, javac -version

HelloWorld 完整流程


// HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

# 編譯
javac HelloWorld.java
# 執行
java HelloWorld
# 輸出: Hello, World!

第二階段:PATH 與 CLASSPATH 深度解析

核心差異

變數用途指向內容誰使用
PATH尋找可執行程式JDK bin 目錄 (javac.exe, java.exe, jar.exe...)作業系統 Shell
CLASSPATH尋找類別檔/資源目錄、JAR 檔、ZIP 檔 (含 .class 的根路徑)JVM (java, javac)

CLASSPATH 關鍵規則

  1. 預設值:. (當前目錄)
  2. 套件對應:com.example.Demo 類別檔必須位於 {classpath}/com/example/Demo.class
  3. 常見錯誤:將 CLASSPATH 設到 .../com/example/ → 應設到 ... (套件根目錄)
  4. 載入順序:Bootstrap → Extension → Application (CLASSPATH)
  5. 萬用字元:Java 6+ 支援 lib/* 載入目錄下所有 JAR

各環境配置方式

環境配置方式
命令列java -cp ".;lib/*" MainClass 或 set CLASSPATH=.;lib/*
Eclipse/IntelliJProject Properties → Java Build Path → Libraries → Add JARs/External JARs
Ant<classpath><pathelement path="..."/></classpath>
Maven/Gradle依賴管理自動構建 CLASSPATH,無需手動設定
Linux/macOSexport CLASSPATH=.:/path/to/lib/* (冒號分隔)

第三階段:開發工具與 API 文件

必備工具鏈

  • JDK 核心工具:javac (編譯), java (執行), jar (打包), javadoc (文件產生), jdb (除錯), jconsole/jvisualvm (監控)
  • IDE 推薦:IntelliJ IDEA (Community 免費), Eclipse, VS Code (Extension Pack for Java)
  • 建構工具:Maven (規範化), Gradle (靈活), 現代專案首選

API 文件查找技巧

  1. 線上:Oracle 官方 API (可切換版本)
  2. 離線:下載 JDK Documentation 整合 IDE (IntelliJ: Settings → Documentation → JavaDoc URLs)
  3. 源碼閱讀:JDK 安裝目錄 src.zip 或 IDE Ctrl+Click 進入類別定義
  4. 搜尋技巧:類別名、方法名、套件名、錯誤訊息關鍵字
  5. 第四階段:核心語法與觀念釐清

    存取修飾詞

    修飾詞同類同包子類(異包)非子類(異包)
    private✅❌❌❌
    (package-private)✅✅❌❌
    protected✅✅✅❌
    public✅✅✅✅

    常見觀念釐清

    • throw vs throws:throw new Exception() 拋出實例 / throws Exception 宣告方法可能拋出
    • upcasting:子類型指派給父類型參考 (Object obj = "str";),向上轉型安全、向下需強制轉型
    • 常數定義:public static final int MAX = 100; (命名全大寫底線分隔)
    • String 不可變:s1 + s2 產生新物件,頻繁拼接用 StringBuilder

    編譯執行進階

    需求命令/技巧
    編譯多檔案javac -d . *.java (依套件結構輸出)
    大量編譯Ant/Maven/Gradle (勿手寫腳本)
    無視窗執行javaw (Windows) / java (Linux/macOS 背景 &)
    執行 JARjava -jar app.jar (需 Manifest Main-Class)
    調整記憶體java -Xms256m -Xmx1024m MainClass
    本地編譯 EXEGraalVM Native Image / jpackage / Launch4j

    第五階段:資料類型轉換速查

    基本型別與包裝類

    
    // String ←→ 基本型別
    int i = Integer.parseInt("123");
    String s = Integer.toString(123);  // 或 String.valueOf(123)
    
    // String ←→ 16進位
    int hex = Integer.decode("0xFF").intValue();  // 255
    
    // 基本型別 ←→ byte[]
    // int → byte[4] (大端序)
    byte[] bytes = ByteBuffer.allocate(4).putInt(12345).array();
    // byte[] → int
    int val = ByteBuffer.wrap(bytes).getInt();
    
    // 隨機整數
    int random = new Random().nextInt(100);  // 0-99
    // 或 ThreadLocalRandom.current().nextInt(100)
    

    日期時間處理 (現代 java.time)

    
    // 當前時間
    LocalDateTime now = LocalDateTime.now();
    Instant nowUtc = Instant.now();
    
    // 格式化
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String str = now.format(fmt);
    
    // 解析
    LocalDateTime parsed = LocalDateTime.parse("2024-03-15 14:30:00", fmt);
    
    // java.util.Date 互轉 (舊代碼相容)
    Date legacy = Date.from(now.atZone(ZoneId.systemDefault()).toInstant());
    LocalDateTime modern = legacy.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
    
    // java.sql.Date (資料庫)
    java.sql.Date sqlDate = java.sql.Date.valueOf(LocalDate.now());
    

    第六階段:常用資料結構

    集合框架選型指南

    介面實作特性適用場景
    ListArrayList陣列、隨機存取快、插刪慢預設首選、頻繁讀取
    LinkedList雙向鏈表、首尾增刪快佇列/棧、頻繁首尾操作
    SetHashSet雜湊、無序、唯一去重、快速查找
    LinkedHashSet維持插入順序有序去重
    TreeSet紅黑樹、自然序/比較器序排序去重
    MapHashMap雜湊、無序、Key 唯一預設首選、快速查找
    LinkedHashMap維持插入/存取順序LRU 快取、有序映射
    TreeMap紅黑樹、Key 排序排序映射

    二維動態陣列實作

    
    // 方案 1: List>
    List> matrix = new ArrayList<>();
    matrix.add(new ArrayList<>(Arrays.asList(1, 2, 3)));
    matrix.add(new ArrayList<>(Arrays.asList(4, 5, 6)));
    
    // 方案 2: Map> (稀疏/命名行)
    Map> namedRows = new HashMap<>();
    namedRows.put("row1", Arrays.asList(1, 2, 3));
    

    第七階段:I/O、網路、系統整合

    檔案讀寫現代寫法 (NIO.2)

    
    // 讀取全文
    String content = Files.readString(Path.of("file.txt"), StandardCharsets.UTF_8);
    
    // 逐行處理 (Stream, 記憶體友善)
    Files.lines(Path.of("big.log"))
         .filter(line -> line.contains("ERROR"))
         .forEach(System.out::println);
    
    // 寫入
    Files.writeString(Path.of("out.txt"), "Hello\n", StandardCharsets.UTF_8);
    Files.write(Path.of("data.bin"), byteArray);
    
    // 複製/移動/刪除
    Files.copy(src, dest, StandardCopyOption.REPLACE_EXISTING);
    Files.move(src, dest);
    Files.deleteIfExists(path);
    

    序列化物件持久化

    
    // 寫入
    try (ObjectOutputStream oos = new ObjectOutputStream(
            new FileOutputStream("user.dat"))) {
        oos.writeObject(user);
    }
    
    // 讀取
    try (ObjectInputStream ois = new ObjectInputStream(
            new FileInputStream("user.dat"))) {
        User u = (User) ois.readObject();
    }
    // ⚠️ 類別需實作 Serializable, 注意 serialVersionUID
    

    網路基礎

    
    // 設定 Proxy
    System.setProperty("http.proxyHost", "proxy.company.com");
    System.setProperty("http.proxyPort", "8080");
    // HTTPS
    System.setProperty("https.proxyHost", "proxy.company.com");
    System.setProperty("https.proxyPort", "8080");
    
    // 執行外部程式
    ProcessBuilder pb = new ProcessBuilder("cmd", "/c", "dir");
    Process p = pb.start();
    try (BufferedReader br = new BufferedReader(
            new InputStreamReader(p.getInputStream()))) {
        br.lines().forEach(System.out::println);
    }
    

    JNI 呼叫本地 DLL

    1. Java 宣告 native 方法
    2. javac → javac -h . MyClass.java 產生 .h 檔
    3. C/C++ 實作 JNI 函數
    4. 編譯為共享庫 (.dll/.so)
    5. System.loadLibrary("mylib") 載入

    常見錯誤與解決方案 Top 10

    1. NoClassDefFoundError / ClassNotFoundException → CLASSPATH 漏包、套件路徑錯誤、版本衝突
    2. NullPointerException → 未初始化、鏈式呼叫中間為 null、Optional 保護
    3. ArrayIndexOutOfBoundsException → 索引超出 0~length-1、for 迴圈邊界
    4. UnsupportedClassVersionError → 編譯版本高於執行版本 (如 JDK 17 編譯, JRE 11 執行)
    5. OutOfMemoryError → Heap 過小 (-Xmx)、記憶體洩漏 (靜態集合累積、未關閉資源)
    6. ClassCastException → 強制轉型錯誤、泛型類型擦除、instanceof 先檢查
    7. NumberFormatException → parseInt 字串非數字、trim() 先移除空白
    8. FileNotFoundException → 相對路徑錯誤、檔案不存在、權限不足
    9. SocketException / ConnectException → 防火牆、Port 被佔用、主機不可達、Proxy 未設
    10. StackOverflowError → 遞迴無終止條件、循環引用 (toString、equals)

    學習路徑建議

    1. 入門 (1-2 週):語法、OO、集合、例外、I/O、單元測試 (JUnit)
    2. 進階 (1-2 月):多執行緒、JDBC、Servlet/JSP、Spring Boot、Maven/Gradle、Git
    3. 高階 (持續):JVM 調優、微服務、雲原生、架構設計、領域驅動設計

    重點原則:多動手、多閱讀官方文件、善用 IDE 重構/除錯、建構工具自動化依賴管理。遇到問題先查 API、StackOverflow、官方教學,養成獨立解決問題能力。

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