java装箱拆箱时都发生了什么?

本文详细解析了Java中装箱与拆箱的过程,通过源码级别的分析,展示了基本类型与包装类之间的转换机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、装箱

我们先看装箱,有如下代码:

public class Box {
    public void packing() {
        Integer  i = 1;
        Float f = 2.0f;
        Long L = 3L;
        Boolean b = true;
        Short s = 5;
        Double d = 6.0;
        Character c = 'A';
        Byte t = 7;
    }
}

我们用javac编译该段代码,然后利用javap反编译这段代码,看看结果:

请注意,蓝线画出来的部分,所有的装箱类型都调用了自己的valueOf方法。

用jd-gui反编译出直观的结果:

这样,我们就能直观的看出装箱的时候,都发生了什么。

二、拆箱:

看如下代码

public class Box {
    public void unBox() {
        Integer i = Integer.valueOf(1);
        Short s = Short.valueOf((short)2);
        Byte b = Byte.valueOf((byte)3);
        Boolean t = Boolean.TRUE;
        Character c = Character.valueOf('A');
        Double d = Double.valueOf(6.0D);
        Float f = Float.valueOf(7.0F);
        Long g = Long.valueOf(8L);

        //拆箱部分
        int one = i;
        short two = s;
        byte three = b;
        boolean four = t;
        char five = c;
        double six = d;
        float seven = f;
        long eight = g;
    }
}

在JDK1.8.0_151的环境下,使用javac编译这段代码,得到Box.class,然后利用javap反编译字节码文件Box.class,截取了拆箱部分反编译结果,得到下图:

大家注意划蓝线的部分,可以看出在拆箱时,装箱类型都调用了各自的xxValue()方法。

借助于jd-gui,我们更直观的看到这个过程:

我们改造一下,上面的代码,改成这样:

public class Box {
    public void unBox() {
        Integer i = Integer.valueOf(1);
        Short s = Short.valueOf((short)2);
        Byte b = Byte.valueOf((byte)3);
        Boolean t = Boolean.TRUE;
        Character c = Character.valueOf('A');
        Double d = Double.valueOf(6.0D);
        Float f = Float.valueOf(7.0F);
        Long g = Long.valueOf(8L);

        //拆箱部分
        int one = i.intValue();
        short two = s.shortValue();
        byte three = b.byteValue();
        boolean four = t.booleanValue();
        char five = c.charValue();
        double six = d.doubleValue();
        float seven = f.floatValue();
        long eight = g.longValue();
    }
}

 在JDK1.8.0_151的环境下,使用javac编译这段代码,然后利用javap,看看反编译结果怎么样?

结果和上面的一模一样。

三、结论:

(1)装箱时,调用装箱类型各自的valueOf(xx value)方法。

(2)拆箱时,调用装箱类型各自的xxValue方法。

【说明】:xx代表基本类型,如boolean、char、int等。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值