Nar*_*ode 16 java autoboxing unboxing
从JDK 5.0开始,自动装箱/拆箱是在java中引入的,技巧简单而有用,但是当我开始测试包装类和原始类型之间的不同转换时,我真的很困惑自动装箱的概念如何在java中工作,例如:
拳击
int intValue = 0;
Integer intObject = intValue;
byte byteValue = 0;
intObject = byteValue; // ==> Error
Run Code Online (Sandbox Code Playgroud)
尝试不同的情况下(后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;
Run Code Online (Sandbox Code Playgroud)
关于拆箱的结论是包装类给出了对应的类型(Integer
==> int
)包装的值,然后编译器使用通常的转换基元类型的规则(byte
=> short
=> int
=> long
=> float
=> double
).我想知道这个结论是否属实,还是自动拆箱使用了另一个概念?
谢谢你提前:)
ars*_*jii 14
如有疑问,请检查字节码:
Integer n = 42;
Run Code Online (Sandbox Code Playgroud)
变为:
0: bipush 42
2: invokestatic #16 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
5: astore_1
Run Code Online (Sandbox Code Playgroud)
所以实际上,valueOf()
与构造函数相反使用(对于其他包装类也是如此).这是有益的,因为它允许缓存,并且不强制在每个装箱操作上创建新对象.
反之如下:
int n = Integer.valueOf(42);
Run Code Online (Sandbox Code Playgroud)
变为:
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
Run Code Online (Sandbox Code Playgroud)
即intValue()
使用(同样,它也类似于其他包装类型).这真的是所有自动(联合国)拳击归结为.
您可以分别在JLS§5.1.7和JLS§5.1.8中阅读有关装箱和拆箱转换的内容.
归档时间: |
|
查看次数: |
9226 次 |
最近记录: |