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()
广告