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

Java 5.0 核心新特性全解析:泛型、自動裝箱、註解、枚舉與 I/O 增強

     編輯:Java 相關知識

Java 5.0 (J2SE 1.5) 是 Java 語言發展史上劃時代的版本,引入了泛型、自動裝箱/拆箱、註解、枚舉類型、靜態導入、可變參數、foreach 迴圈等重大語法特性,極大提升開發效率與代碼安全性。本文系統梳理核心新特性語法與實戰範例。

一、 自動裝箱/拆箱

基本類型與包裝類自動轉換,編譯器隱式插入轉換代碼 (位元碼層面仍為手動調用)。

// 過去
int i = 1;
Integer iObj = new Integer(i);
int j = iObj.intValue();

// Java 5.0
int i = 1;
Integer iObj = i;        // 自動裝箱
int j = iObj;            // 自動拆箱

// 集合操作更簡潔
List list = new ArrayList<>();
list.add(1);             // 自動裝箱
int val = list.get(0);   // 自動拆箱

注意:頻繁裝箱/拆箱在高效能循環中可能產生臨時物件壓力,熱點路徑建議仍使用基本類型陣列或專用庫 (如 Trove)。

二、 泛型

提供編譯期型別安全,消除強制轉型,實現參數化類型 (類似 C++ 模板,但採用類型擦除實現)。

// 過去:無型別約束,取出需轉型
Map map = new HashMap();
map.put("key", "value");
String s = (String) map.get("key"); // 運行時風險

// Java 5.0:編譯期強制型別檢查
Map map = new HashMap<>();
map.put("key", "value");
String s = map.get("key"); // 無需轉型,型別安全

// 配合自動裝箱
Map map = new HashMap<>();
map.put(1, "one"); // int 自動裝箱為 Integer

核心優勢:編譯期發現型別錯誤、API 文檔化、消除 ClassCastException 風險。

三、 註解

元程式設計基石,取代 XDoclet/Javadoc 標籤,提供標準化元資料機制。註解本質是繼承 java.lang.annotation.Annotation 的介面,Class 檔案標記 ACC_ANNOTATION。

// JDK 1.4 風格 (Javadoc 標籤)
/**
 * @todo to be implemented
 **/
void gimmeSomeLoving() { throw new Exception("not implemented"); }

// JDK 5.0 註解
@Todo
void gimmeSomeLoving() { throw new Exception("not implemented"); }

// 內建註解範例
@Override
public String toString() { return "safe"; }

@SuppressWarnings("unchecked")
void legacyCall() { /* 抑制非受檢警告 */ }

@Deprecated
void oldMethod() { /* 標記棄用 */ }

應用場景:框架配置 (Spring/EJB 3.0/JPA)、編譯期檢查、代碼生成、測試標記 (JUnit 4 @Test)、AOP 切點定義等。

四、 枚舉類型

類型安全的常量集合,編譯為擁有 ACC_ENUM 標記的 final 類,實例為單例,天然支援 switch、可實現介面、擁有方法屬性。

// 過去:int 常量模式,無型別安全
class JavaTech {
    public static final int J2ME = 1;
    public static final int J2SE = 2;
    public static final int J2EE = 3;
}

// Java 5.0 枚舉
public enum JavaTech {
    J2ME, J2SE, J2EE;
}

// 進階:帶屬性與方法
public enum Planet {
    MERCURY(3.303e+23, 2.4397e6),
    VENUS  (4.869e+24, 6.0518e6);
    private final double mass, radius;
    Planet(double mass, double radius) { this.mass = mass; this.radius = radius; }
    public double surfaceGravity() { return G * mass / (radius * radius); }
}

優勢:型別安全、名稱空間隔離、可序列化、支援 switch、可實現介面、防止實例化攻擊。

五、 輸入輸出增強:Scanner 與格式化

新增 java.util.Scanner 簡化文本解析,System.out.printf/String.format 提供 C 風格格式化輸出。

import java.util.Scanner;
import java.io.*;

public class TestRead {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入一句字串: ");
        String str = scanner.nextLine();
        System.out.println("您輸入: " + str);
        
        // 格式化輸出
        System.out.printf("長度: %d, 大寫: %s%n", str.length(), str.toUpperCase());
    }
}

Scanner 優勢:支援正則分隔符、基本類型直接解析 (nextInt()、nextDouble())、文件/流/字串統一掃描源。

六、 其他重要新特性速覽

  • 靜態導入:import static java.lang.Math.*; 直接使用 sin()、PI。
  • 可變參數:void printAll(String... msgs) 內部為陣列。
  • Foreach 迴圈:for (String s : list) 適用 Iterable/陣列。
  • 國際化增強:支援 UTF-16 補充字符,類名可用 Unicode (如 public class 哈囉世界)。

七、 應用程式開發介面 (API) 治理

Java API 以類為單位組織為包,透過 JCP (Java Community Process) 開放式治理,IBM/BEA 等廠商參與演進。2004 年開源提議遭 Sun 拒絕,2006 年 Sun 宣佈 OpenJDK 開源計畫 (GPL)。

八、 經典 Hello World 與國際化示範

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

// Unicode 類名合法範例
public class 哈囉世界 {
    private String 文本 = "哈囉世界";
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved