Java 自动装箱和拆箱怎么用?

文章导读
Previous Quiz Next Java 自动装箱 自动装箱是 Java 编译器使用的一种技术,用于自动将原始值转换为其对应的包装类对象。例如,当将一个 int 值赋给 Integer 包装类对象时,编译器会自动将 int 值转换为对象,而无需显式地转换 int 值或
📋 目录
  1. A Java 自动装箱
  2. B Java 拆箱
  3. C 原始类型与包装对象的映射
A A

Java - 自动装箱和拆箱



Previous
Quiz
Next

Java 自动装箱

自动装箱是 Java 编译器使用的一种技术,用于自动将原始值转换为其对应的包装类对象。例如,当将一个 int 值赋给 Integer 包装类对象时,编译器会自动将 int 值转换为对象,而无需显式地转换 int 值或调用任何方法来将 int 转换为 Integer 对象。自动装箱也被称为装箱。

// 自动装箱
Integer obj = 10;

// 显式转换
Integer obj2 = Integer.valueOf(10)

在两种情况下,包装类对象都被初始化为一个 int 值。在第一种情况下,自动装箱起作用;在第二种情况下,我们显式地将 int 值转换为 Integer 包装类对象。

编译器在以下场景中使用自动装箱:

  • 如果将原始值作为参数传递给期望包装类对象的函数。

  • 如果将原始值赋给包装类类型的变量。

Java 中自动装箱的示例

在这个示例中,我们创建了一个 Integer 的列表,因为 List 只能包含对象。在向该列表添加项目时,我们没有创建任何 Integer 对象,而只是传递了原始的 int 值。Java 编译器自动处理了转换,程序成功编译。我们还使用了将 char 原始值赋给 Character 对象的另一个案例,这也同样有效。

package com.;

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++){
         // 作为参数传递时的自动装箱
         // int 值在编译期间被编译器转换为 Integer
         list.add(i);
      }

      System.out.println(list);

      char c = 'a';          
      //将 char 赋给 Character 对象的自动装箱
      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);

// 拆箱
int i = obj;

// 显式值提取
i = obj.intValue();

在两种情况下,原始值都用 int 值进行初始化。在第一种情况下,拆箱起作用;在第二种情况下,我们显式地从 Integer 包装对象中获取 int 值。

编译器在以下场景中使用拆箱 −

  • 如果将包装类对象作为参数传递给期望原始值的函数。

  • 如果将包装类对象赋给原始类型的变量。

Java 中拆箱的示例

在这个示例中,我们创建了一个 Integer 对象,并用 10 初始化它。这个对象被传递给 abs() 方法,该方法期望一个 int,即原始变量。Java 编译器自动处理转换,程序成功编译。我们还使用了另一种情况,即将 Integer 对象赋给 int 变量,这也同样有效。

package com.;

public class Tester {
   public static void main(String[] args) {
      Integer integer = Integer.valueOf(-10);
      // 通过作为参数传递进行拆箱
      // Integer 对象在编译期间被编译器转换为 int
      int i = abs(integer);        
      System.out.println(i);

      //通过将 Integer 对象赋给 int 变量进行拆箱
      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()