作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
从 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
)。我想知道这个结论是否正确,还是自动拆箱使用了另一个概念?
最佳答案
如有疑问,请检查字节码:
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 , 分别。
关于java - 自动装箱/拆箱如何在 Java 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22648627/
我是一名优秀的程序员,十分优秀!