Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路程式設計

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java APIs 和框架

Java 類引用

Java 有用資源

Java - 自動裝箱和拆箱



Java 自動裝箱

自動裝箱是 Java 編譯器 自動將基本型別值轉換為其 包裝器 對應型別的一種技術。例如,當一個 int 值賦值給一個 Integer 包裝器物件時,編譯器會自動將 int 值轉換為物件,而無需顯式轉換 int 值或呼叫任何 方法 將 int 轉換為 Integer 物件。自動裝箱也稱為裝箱。

// Autoboxing
Integer obj = 10;

// Explicit casting
Integer obj2 = Integer.valueOf(10)

在這兩種情況下,包裝器物件都用 int 值初始化。在第一種情況下,自動裝箱起作用;在第二種情況下,我們顯式地將 int 值轉換為 Integer 包裝器物件。

編譯器在以下情況下使用自動裝箱:

  • 如果將基本型別值作為引數傳遞給期望包裝器類物件的函式。

  • 如果將基本型別值賦給包裝器類型別的變數。

Java 中自動裝箱的示例

在這個例子中,我們建立了一個 Integer 列表,因為 List 只包含物件。現在,在向此列表新增專案時,我們沒有建立任何 Integer 物件,而只是傳遞了基本 int 值。Java 編譯器會自動處理轉換,程式會成功編譯。我們還使用了將 char 基本型別值賦給 Character 物件的另一個例子,它也能正常工作。

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.List;

public class Tester {
   public static void main(String[] args) {
      List<Integer> list = new ArrayList<>();

      for(int i = 0; i< 10; i++){
         // autoboxing by passing as an argument
         // int value is converted to Integer
         // by compiler during compilation
         list.add(i);
      }

      System.out.println(list);

      char c = 'a';          
      //autoboxing by assigning a char to Character object
      Character ch = c;
      System.out.println(ch);
   }
}

輸出

讓我們在沒有任何 命令列引數 的情況下編譯並執行上述程式,這將產生以下結果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a

Java 拆箱

拆箱是自動裝箱的反向操作。Java 編譯器使用拆箱將包裝器物件轉換為其基本型別對應物。例如,當一個 Integer 物件作為引數傳遞給一個方法,但呼叫的方法期望一個 int 變數 時,編譯器會自動將 Integer 物件轉換為 int 值,然後將其傳遞給呼叫的方法。類似地,如果 Java 編譯器將包裝器值賦值給基本型別變數,則會進行拆箱。因此,我們不需要顯式地從包裝器物件中獲取 int 值。

Integer obj = Integer.valueOf(10);

// Unboxing
int i = obj;

// Explicit value deduction
i = obj.intValue();

在這兩種情況下,基本型別值都用 int 值初始化。在第一種情況下,拆箱起作用;在第二種情況下,我們顯式地從 Integer 包裝器物件中獲取 int 值。

編譯器在以下情況下使用拆箱:

  • 如果將包裝器類物件作為引數傳遞給期望基本型別值的函式。

  • 如果將包裝器類物件賦給基本型別的變數。

Java 中拆箱的示例

在這個例子中,我們建立了一個Integer物件並用值10初始化它。這個物件被傳遞給abs()方法,該方法期望一個int型,一個原始變數。Java編譯器會自動處理轉換,程式能夠成功編譯。我們還使用了另一種將Integer物件賦值給int變數的情況,這也是可行的。

package com.tutorialspoint;

public class Tester {
   public static void main(String[] args) {
      Integer integer = Integer.valueOf(-10);
      // unboxing by passing as an argument
      // Integer object is converted to int
      // by compiler during compilation
      int i = abs(integer);        
      System.out.println(i);

      //unboxing by assigning an Integer object to int variable
      int j = integer;        
      System.out.println(j);
   }
 
   private static int abs(int i){
      return (i < 0)? -i: i;
   }
}

輸出

讓我們在沒有任何命令列引數的情況下編譯並執行上述程式,這將產生以下結果:

10
-10

原始型別和包裝類物件的對映

序號原始型別包裝類獲取值的方法
1byteBytebyteValue()
2shortShortshortValue()
3intIntegerintValue()
4longLonglongValue()
5floatFloatfloatValue()
6doubleDoubledoubleValue()
7charCharactercharValue()
8booleanBooleanbooleanValue()
廣告
© . All rights reserved.