Java 简明教程
Java - Autoboxing and Unboxing
Java Autoboxing
程序自动打包是 Java compiler 用来将原始值自动转换为其 wrapper 对应值的技术。例如,当将 int 值分配给 Integer 封装对象时,编译器会自动将 int 值转换为对象,而无需显式强制转换 int 值或通过调用任何 method 将 int 转换为 Integer 对象。自动打包也称为打包。
// Autoboxing
Integer obj = 10;
// Explicit casting
Integer obj2 = Integer.valueOf(10)
在这两种情况下,封装对象都使用 int 值进行初始化。在第一种情况下,自动装箱起作用,而在第二种情况下,我们明确地将 int 值强制转换成 Integer 封装对象。
编译器在以下情况下使用自动装箱:
-
如果将原始值作为参数传递给需要封装器类对象的方法。
-
如果将原始值分配给封装器类类型的变量。
Example of Autoboxing in 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);
}
}
让我们编译并运行上述程序,而不进行任何 command line argument,这将产生以下结果 −
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a
Java Unboxing
解包是自动打包的逆过程。Java 编译器使用解包将封装对象转换为其原始对应的对象。例如,当将 Integer 对象作为参数传递给方法时,而所调用的方法期望有 int variable 时,编译器会自动将 Integer 对象转换为 int 值,然后将它传递给所调用的方法。同样,如果将封装值分配给原始变量,Java 编译器也会解包封装值。因此我们不需要从封装对象中显式获取 int 值。
Integer obj = Integer.valueOf(10);
// Unboxing
int i = obj;
// Explicit value deduction
i = obj.intValue();
在这两种情况下,基本类型值都使用 int 值进行初始化。在第一种情况下,拆箱起作用,而在第二种情况下,我们明确地从 Integer 封装对象中获取 int 值。
编译器在以下情况下使用拆箱:
-
如果将封装器类对象作为参数传递给需要基本类型值的方法。
-
如果将封装器对象分配给基本类型变量。
Example of Unboxing in 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
Mapping of Primitive and Wrapper Objects
Sr. No. |
Primitive |
Wrapper |
method to get value |
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() |