包装类对象初始化如何工作?

时间:2018-08-04 08:22:08

标签: java

在Java中

Integer i=10;

Integer作为包装类。当它仅是对象引用时如何初始化?有人可以解释吗?

1 个答案:

答案 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通过使用intInteger int转换为包装器类型10。实际上,由于数量很小(IntegerInteger.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实现都使用该方法(您可以在生成的字节码中看到它)。