gpt4 book ai didi

java - 自动装箱/拆箱如何在 Java 中工作?

转载 作者:太空狗 更新时间:2023-10-29 22:56:18 25 4
gpt4 key购买 nike

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

拳击

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

在尝试了不同的情况(shortlongfloatdouble)之后,唯一的情况是被编译器接受的是当修饰运算符右边的值的类型是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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com