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

从JDK 5.0开始,在java中引入了自动装箱/拆箱function,这个技巧简单而有用,但是当我开始测试包装器类和原始类型之间的不同转换时,我真的很困惑,例如自动装箱的概念在java中是如何工作的,例如:

拳击

int intValue = 0; Integer intObject = intValue; byte byteValue = 0; intObject = byteValue; // ==> Error 

在尝试不同的情况( shortlongfloatdouble )之后,编译器接受的唯一情况是当effectation运算符右边的值的类型为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 )。 我想知道这个结论是否属实,还是自动拆箱使用了另一个概念?

谢谢你提前:)

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

 Integer n = 42; 

变为:

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

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

反之如下:

 int n = Integer.valueOf(42); 

变为:

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

即使用intValue() (同样,它也类似于其他包装类型)。 这真的是所有自动(联合国)拳击归结为。

您可以分别在JLS§5.1.7和JLS§5.1.8中阅读有关装箱和拆箱转换的内容。

自动装箱和自动拆箱

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

 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 } 

}

谢谢..

请考虑以下代码作为自动解除装箱的示例:

 System.out.println('b'+ new Integer(63)); 

以下是上述代码编译方式的细分:

步骤1:对象整数63被实例化,然后AUTO-UNBOXED到int 63

 new Integer(63) 

第2步:char’b’转换为数值,即98

第3步:添加两个值:98 + 63

第4步:输出为161