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