装箱(装包):将简单类型变为包装类类型
拆箱(拆包):将包装类类型变为简单类型
2.1装包代码案例
//装包
public static void main(String[] args) {
//int i = 10;
Integer a = 10;//自动装包(装箱)
//Integer b = new Integer(10);//显示装包
Integer integer = new Integer(10);//显示装包
System.out.println(a);
}
那么自动装箱和自动装包的原理又是什么呢?
使
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
用Java命令是反编译代码
备注一些简单的JDK命令:javac java javap -c jconsole jmap
那么就进入到Integer下的源码去找valueOf方法,我们可以看到实际上是调用了这个方法,这里的valueOf方法就是实现了装包
2.2拆包代码案例
//拆包
public static void main1(String[] args) {
Integer a = 10;
int b = a;//自动拆包
System.out.println(b);
}
同样使用JDK命令查看反编译
以看出拆包过程调用了Integer下的intValue方法,同样跳转去看源码是什么样的
也就是代码中的直接将a的值10赋值给了b然后返回
注意:拆包并不是都调用的intValue方法
代码案例
//拆包
public static void main(String[] args) {
Integer a = 10;
int b = a;//自动拆包
System.out.println(b);
long c = a.longValue();//将a拆成long类型,显示拆包
double d = a.doubleValue();//将a拆成double类型,显示拆包
System.out.println©;
System.out.println(d);
}
使用命令查看反编译
我们可以看出,在发生拆包的过程中,拆成什么类型的包就调用Integer下的什么类型的Vlaue方法
3常见的错误比较
判断一下a是否等于b
当然这个是肯定为true
但是请看下面的代码
这里会有很多人有疑问,这是为什么,难道编译器出错了?答案当然不是,是因为区域的关系
我们再次回到源码