Java中的装箱&拆箱

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进行取余操作,除了执行拆箱操作。而这其中的拆装箱都是自动完成的。


版权声明:本文为muyuxifeng原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。