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

Java 核心基礎:自動裝箱拆箱與枚舉類型詳解

     編輯:Java 綜合教學

自動裝箱與拆箱

JDK 5.0 引入自動裝箱/拆箱機制,讓基本類型與包裝類之間能自動轉換,極大簡化代碼。但本質上仍是編譯器語法糖,理解其內部原理有助於避免性能陷阱與 NPE 風險。

基本規則

  • 裝箱:基本類型 → 包裝類對象。如 Integer i = 10; 等價 Integer i = Integer.valueOf(10);
  • 拆箱:包裝類對象 → 基本類型。如 int n = i; 等價 int n = i.intValue();
  • 適用於所有 8 種基本類型:boolean/Boolean、byte/Byte、short/Short、char/Character、int/Integer、long/Long、float/Float、double/Double

編譯器判斷邏輯

編譯器根據上下文自動插入 valueOf 或 xxxValue() 調用。表達式運算中也會觸發:

Integer i = 10;
System.out.println(i + 10); // i 自動拆箱為 int 參與加法
System.out.println(i++);    // 拆箱、自增、裝箱

完整示例

public class AutoBoxDemo {
    public static void main(String[] args) {
        int i = 10;
        double d = 10.5;
        // 裝箱
        Integer num1 = i;
        Double num2 = d;
        System.out.println(num1); // 10
        System.out.println(num2); // 10.5
        // 拆箱
        int j = num1;          // num1.intValue()
        double dd = num2;      // num2.doubleValue()
        System.out.println(j); // 10
        System.out.println(dd); // 10.5
        // 多態賦值
        Object o = i;          // 裝箱為 Integer
        System.out.println(o); // 10
        Integer b = (Integer) o; // 向下轉型
        System.out.println(b); // 10
    }
}

注意事項

  • 緩存機制:Integer.valueOf(-128~127) 返回緩存對象,超出範圍創建新對象。直接 new Integer() 總創建新對象。
  • NPE 風險:拆箱時若包裝類引用為 null,拋出 NullPointerException。
  • 性能開銷:頻繁裝箱拆箱產生大量臨時對象,增加 GC 壓力。熱點循環建議用基本類型。
  • == 比較陷阱:包裝類 == 比較引用地址,需用 equals() 比較值。

枚舉類型

枚舉是一種特殊的類,隱式繼承 java.lang.Enum<E>,提供類型安全的常量集合。

基本定義與特性

public enum Color {
    RED, BLUE, BLACK, YELLOW, GREEN;
}
  • 枚舉值隱式 public static final,建議全大寫命名。
  • 枚舉類可定義構造器、字段、方法,但構造器只能 private,在類加載時自動調用創建實例。
  • 實現了 Comparable、Serializable,可用於 switch、集合、序列化。

進階用法:帶參數枚舉

enum Person {
    P1("張三", 30), P2("李四", 20), P3("王五", 18);
    private String name;
    private int age;
    private Person(String name, int age) { this.name = name; this.age = age; }
    @Override public String toString() { return name + "--" + age; }
}

public class EnumDemo {
    public static void main(String[] args) {
        System.out.println(Color.RED); // RED
        // 遍歷
        for (Color c : Color.values()) System.out.println("循環:" + c);
        // switch
        Person p = Person.P3;
        switch (p) {
            case P1: System.out.println("switch:" + Person.P1); break;
            case P2: System.out.println("switch:" + Person.P2); break;
            case P3: System.out.println("switch:" + Person.P3); break;
        }
    }
}

輸出:

RED
循環:RED
循環:BLUE
循環:BLACK
循環:YELLOW
循環:GREEN
switch:王五--18

JVM 層面實現

類加載時會預先創建所有枚舉實例,相當於:

public static final Color RED = new Color();
public static final Color BLUE = new Color();
// ...

構造器調用次數等於枚舉值個數,保證單例語義。

最佳實踐

  • 用枚舉替代 public static final int 常量,獲得類型安全與 IDE 支持。
  • 枚舉實現接口可實現策略模式,每個枚舉值提供不同行為實現。
  • 避免在枚舉構造器中執行耗時操作,影響類初始化性能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved