Java中的装箱&拆箱

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整除
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值