自动装箱是一种技术,Java 编译器会自动地将原始类型值转换为其包装类的对应物。例如,当一个 int
值被赋给 Integer
包装对象时,编译器会自动将 int
值转换为对象,而不需要显式地进行类型转换或者调用方法来转换 int
到 Integer
对象。自动装箱也被称为装箱。
示例 - 自动装箱
Integer obj = 10;
显式转换
Integer obj2 = Integer.valueOf(10);
在这两种情况下,包装对象都被初始化为一个 int
值。在第一种情况下,自动装箱发挥了作用;而在第二种情况下,我们显式地将 int
值转换为 Integer
包装对象。
编译器会在以下场景下使用自动装箱:
-
如果一个原始类型的值被传递给期望包装类对象的方法。
-
Java 中自动装箱的示例
在这个示例中,我们创建了一个 Integer
类型的列表,因为列表只能包含对象。现在,在向这个列表添加元素时,我们没有创建任何 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++){
list.add(i);
}
System.out.println(list);
char c = 'a';
Character ch = c;
System.out.println(ch);
}
}
输出结果如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a
Java 自动拆箱 (Unboxing)
自动拆箱是自动装箱的逆过程。自动拆箱是由 Java 编译器用来将一个包装对象转换为其原始类型的过程。例如,当一个 Integer
对象作为参数传给一个期望 int
变量的方法时,编译器会自动将 Integer
对象转换为 int
值,然后传递给调用的方法。同样地,如果一个包装值被赋给一个原始类型的变量,那么 Java 编译器也会自动拆箱该包装值。因此,我们不需要显式地从包装对象中获取原始类型的值。
Integer obj = Integer.valueOf(10);
int i = obj;
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);
int i = abs(integer);
System.out.println(i);
int j = integer;
System.out.println(j);
}
private static int abs(int i){
return (i < 0)? -i: i;
}
}
输出结果如下:
10
-10
原始类型和包装对象的映射
序号 |
原始类型 |
包装类 |
获取值的方法 |
1 |
byte |
Byte |
byteValue() |
2 |
short |
Short |
shortValue() |
3 |
int |
Integer |
intValue() |
4 |
long |
Long |
longValue() |
5 |
float |
Float |
floatValue() |
6 |
double |
Double |
doubleValue() |
7 |
char |
Character |
charValue() |
8 |
boolean |
Boolean |
booleanValue() |