【问题标题】:How does wrapper class object initialisation works? [duplicate]包装类对象初始化如何工作? [复制]
【发布时间】:2019-01-12 00:09:43
【问题描述】:

在 Java 中

Integer i=10;

Integer 作为包装类。当它只是一个对象引用时,它是如何初始化的?谁能解释一下?

【问题讨论】:

标签: java


【解决方案1】:

声明

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):

如果pint 类型的值,则装箱转换将p 转换为类和类型Integer 的引用r,这样r.intValue() == p

但大多数 JVM 实现都使用该方法(您可以在生成的字节码中看到)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2019-11-14
    • 2012-01-17
    • 2013-04-11
    相关资源
    最近更新 更多