Java为每种基本数据类型都提供了对应的包装类,而且还提供了包装类与基本数据类型之间的互相转化机制,也就是所谓的“装箱”和“拆箱”。
概念:
- 装箱:把基本数据类型转换成包装类的过程。
- 拆箱:把包装类转换成基本数据类型的过程。
分类:
从实现的角度而言,可以分为“手动拆装箱”与“自动拆装箱”的操作。
- 手动装箱:可以结合类型的构造方法或者valueOf()方法实现。
- 手动拆箱:可以通过xxxValue()方法实现。
- 自动装箱:把一个基本类型变量直接赋值给对应的包装类变量。
- 自动拆箱:允许把包装类对象直接赋值给对应的基本数据类型变量。
以Integer和Boolean为例,手动拆装箱如下图1所示,自动拆装箱如下图2所示。
PS:如果JDK版本较高(譬如jdk11以上),在应用构造方法进行手动装箱时,编译器会在方法上提示有删除线,标识此方法不推荐,但并不影响程序运行与方法调用。
自动装箱的底层,依然是手动装箱、拆箱操作。只是Java通过一种相对简洁的语法方式,进行了封装(也称 语法糖/编译器级别特性)。其中,在自动装箱操作中,使用的是各自类型的valueOf()方法,自动拆箱操作中使用的是各自的xxxValue()方法。
//图1
public static void main(String[] args){
// 手动装箱
int one = 12;
// 方式1:构造方法传参
Integer t1 = new Integer(one);
// 方式2:类型.valueOf方法
Integer t2 = Integer.valueOf(one);
boolean flag = true;
// 方式1:构造方法传参
Boolean f1 = new Boolean(flag);
// 方式2:类型.valueOf方法
Boolean f2 = Boolean.valueOf(flag);
// 手动拆箱
// 对象.xxxValue()方法
int two = t1.intValue();
boolean otherFlag = f1.booleanValue();
}
//图2
public static void main(String[] args){
// 自动装箱
int one = 12;
Integer t1 = one;
boolean flag = true;
Boolean f2 = flag;
// 自动拆箱
int two = t1;
boolean otherFlag = f1;
}
应用:
- 当进行赋值操作时,会触发拆装箱操作
- 当方法调用,传入参数时,也会触发相关操作
- 当结合操作符进行运算操作时,也会触发相关操作
如下图3所示,类中定义静态方法testAge,当在main方法中,调用该方法并传入包装类对象时,执行拆箱操作;进入testAge方法,当进行加法运算时,执行装箱操作;后进入if判断与5进行取余操作,执行了拆箱操作。而这其中的拆装箱都是自动完成的。
//图3
public class WrapTest{
public static void main(String[] args){
// 传参(拆箱):Integer-->int
testAge(new Integer(1));
}
public static void testAge(int i){
// 计算(装箱):int-->Integer
Integer templess = 20 + i;
// 计算(拆箱):Integer-->int
if(templess % 5 == 0)
System.out.println("能被5整除");
else
System.out.println("不能被5整除");
}
}
//运算结果:不能被5整除