在Java中
Integer i=10;
Integer
作为包装类。当它仅是对象引用时如何初始化?有人可以解释吗?
答案 0 :(得分:2)
声明
var onIndex
的缩写:
IMetadataAware
因此,首先Java创建了一个名为Integer i = 10;
的变量,该变量允许引用类型为Integer i; // Variable declaration
i = 10; // Variable assignment
的实例。
执行完右侧后,i
是类型为Integer
的整数文字(请参阅JLS§3.10.1)。然后,Java尝试将10
分配给您的int
变量int
。类型不同,在正常情况下将无法进行分配。
但是,Java能够自动将Integer
转换为i
,反之亦然。这称为自动装箱,Java可以对所有原语及其包装程序执行此操作(请参见JLS§5.1.7)。
因此Java通过使用int
将Integer
int
转换为包装器类型10
。实际上,由于数量很小(Integer
至Integer.valueOf(10)
),因此该方法从内部池中返回了缓存的-128
,而不是创建新实例。
因此在 Java魔术之后,您的代码是:
+127
这是有效的分配,因为右侧也是Integer
,而不是Integer i = Integer.valueOf(10);
。
实际上,JLS中没有描述Integer
的用法。它只是说Java必须能够自动将int
转换为Integer.valueOf
(从JLS§5.1.7转换为):
如果
int
是类型Integer
的值,则装箱转换将p
转换为类型为int
的引用p
,例如{ {1}}。
但是大多数JVM实现都使用该方法(您可以在生成的字节码中看到它)。