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

一、装箱

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

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等。

猜你喜欢

转载自blog.csdn.net/guohengcook/article/details/81271669