自动装箱和自动拆箱

基本实现

为什么会有包装类

java是一门面向对象的语言,一切皆是对象。但是像int这种基本类型不是对象,而我们有时候需要将int转换成对象,所以就有了包装类的概念,每个基本类型都有个一个对应的包装类。

对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值。

同时, 对象包装器类还是 final , 因此不能定义它们的子类

----来自java核心技术卷1(第十版)

byteintshortlongcharvoidbooleanfloatdouble
ByteIntegerShortLongCharacterVoidBooleanFloatDouble
自动装箱与自动拆箱
自动装箱

当我们使用列表是,我们定义一个整数数组列表,执行添加操作

//<>不能是基本类型,所以采用Integer --> 这也是包装类的用途之一
List<Integer> list = new ArrayList<>();
list.add(1);

我们进行反编译可以看到

image-20220115212837506

其实我们进行的

list.add(1)

list.add(Integer.valueOf(1))

这就是自动装箱

自动拆箱

还是以一个例子来说,让我们思考一下执行下面这行代码的过程是怎么样呢?

int n = list.get(1)

还是进行反编译来看一看

image-20220115215807758

可以看到我们执行的其实是

int n = list.get(1).intValue()

这就是自动拆箱

小知识点🌟

装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时, 插人必要的方法调用。虚拟机只是执行这些字节码。

小例子

1. 关于包装类的计算
        Byte a = 1;
        Byte b = 2;
        int c = a + b;

反编译

image-20220115220539971

可以看出我们在赋值的时候,进行了自动装箱,然后进行加法计算时进行了自动拆箱

这里还有一个小知识点🌟

精度小于int的类型,在进行加法是会转换成int进行计算

2.判相等

让我们来猜一下输出结果

int a = 1;
int b = 100;
Integer a1 = 1;
Integer b1 = 100;
Integer a2 = new Integer(1);
Integer b2 = new Integer(100);
System.out.println(a == a1);
System.out.println(a == a2);
System.out.println(a1 == a2);
System.out.println(b == b1);
System.out.println(b == b2);
System.out.println(b1 == b2);

输出结果为

image-20220115222037005

解释:

前两个是true是因为自动拆箱,在判相等时都拆成了基本类型进行比较,所以是true

而最后一个false是因为 “==”判断的是值,而Integer a1 = 1;是值引用,赋的是值,进行new操作是对象引用,赋的是地址

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值