为了账号安全,请及时绑定邮箱和手机立即绑定

Java自动装箱/拆箱如何工作?

Java自动装箱/拆箱如何工作?

红糖糍粑 2019-09-26 10:16:45
从JDK 5.0开始,自动装箱/拆箱是在Java中引入的,此技巧很简单且很有帮助,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念在Java中的工作原理:拳击int intValue = 0;Integer intObject = intValue;byte byteValue = 0;intObject = byteValue; // ==> Error尝试不同的情况下(后short,long,float,double),这是由编译器所接受的唯一情况是,当值的上做作运算符右侧的类型是int。当我查看内部源时,Integer.class我发现它仅实现一个带int参数的构造函数。因此,我的结论是,自动装箱的概念基于在包装类中实现的构造函数。我想知道这个结论是否正确,还是自动装箱使用了另一个概念?拆箱Integer intObject = new Integer(0);byte byteValue = intObject; // ==> Error (the same Error with short)int intValue = intObject; double doubleValue = intObject;我关于拆箱的结论是,包装器类提供了对象以相应类型(Integer==> int)包装的值,然后编译器使用转换原始类型的常规规则(byte=> short=> int=> long=> float=> double)。我想知道这个结论是否正确,还是自动拆箱使用了另一个概念?谢谢你提前:)
查看完整描述

3 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

如有疑问,请检查字节码:

Integer n = 42;

变为:

0: bipush        422: invokestatic  #16                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;5: astore_1

因此,实际上,它valueOf()是与构造函数相对使用的(其他包装类也是如此)。这是有益的,因为它允许缓存,并且不会在每次装箱操作时强制创建新对象。

反之则如下:

int n = Integer.valueOf(42);

变成:

0: bipush        422: invokestatic  #16                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;5: invokevirtual #22                 // Method java/lang/Integer.intValue:()I8: istore_1

intValue()使用(同样,它也与其他包装类型类似)。这实际上是所有自动装箱归结为。

您可以分别在JLS§5.1.7JLS§5.1.8中了解装箱和拆箱转换。


查看完整回答
反对 回复 2019-09-26
?
白衣非少年

TA贡献1155条经验 获得超0个赞

自动装箱和自动拆箱

自动装箱意味着当我们尝试将原始数据分配给对象类型时,它会自动将自身转换为该对象类型。该过程称为自动装箱..当对象类型转换为原始类型时,其称为拆箱...尝试了解它来自以下示例。

class Demo{public static void main(String args[]){
    int x=100;

    //Integer iob=x; //Illegal jdk1.4
    Integer iob=Integer.valueOf(x); //Legal at JDK1.4 =>Boxing

    Integer iob2=x; //Legal JDK1.5 - Autoboxing
    System.out.println(iob2);}

}

自动装箱的另一个例子

class Demo{public static void main(String args[]){
    Integer iob=new Integer(100);    
    int x;
    x=iob; //Legal => auto unboxing
    System.out.println(x);}

}

自动拆箱示例

class Demo{public static void main(String args[]){
    Integer iob=new Integer(100);
    int x=iob; //Auto unboxing ==>Assignment}

}

谢谢..


查看完整回答
反对 回复 2019-09-26
  • 3 回答
  • 0 关注
  • 373 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信