【发布时间】:2019-01-12 00:09:43
【问题描述】:
在 Java 中
Integer i=10;
Integer 作为包装类。当它只是一个对象引用时,它是如何初始化的?谁能解释一下?
【问题讨论】:
-
参见 Oracle 的 Java 教程中的 Autoboxing and Unboxing。
标签: java
在 Java 中
Integer i=10;
Integer 作为包装类。当它只是一个对象引用时,它是如何初始化的?谁能解释一下?
【问题讨论】:
标签: java
声明
Integer i = 10;
是:
Integer i; // Variable declaration
i = 10; // Variable assignment
首先,Java 创建了一个名为i 的变量,它允许引用Integer 类型的实例。
在右侧执行之后,10 是一个 int 类型的整数文字(请参阅JLS§3.10.1)。然后Java 尝试将int 分配给您的Integer 变量i。类型不同,通常情况下无法分配。
但是,Java 能够自动将int 转换为Integer,反之亦然。这称为自动装箱,Java 可以对所有原语及其包装器执行此操作(请参阅JLS§5.1.7)。
因此,Java 使用 Integer.valueOf(10) 将您的 int 10 转换为包装器类型 Integer。事实上,由于数量很小(-128 到 +127),该方法从内部池中返回缓存的 Integer,而不是创建新实例。
所以在 Java 魔法 之后,您的代码是:
Integer i = Integer.valueOf(10);
这是一个有效的赋值,因为右侧也是 Integer 而不是 int。
其实Integer.valueOf的用法并没有在JLS中描述。它只是说Java必须能够自动将int转换为Integer(来自JLS§5.1.7):
如果
p是int类型的值,则装箱转换将p转换为类和类型Integer的引用r,这样r.intValue() == p。
但大多数 JVM 实现都使用该方法(您可以在生成的字节码中看到)。
【讨论】: