【问题标题】:Java Wrapper class reference pointing to a primitive value指向原始值的 Java Wrapper 类引用
【发布时间】:2018-03-13 10:09:01
【问题描述】:

我对 IntegerCharacter 这样的 Java 包装类有疑问。我知道当我们声明一个类 Abc 并可以在 Java 中为它创建一个对象时,就像

Abc a = new Abc(); 

它引用Abc 类实例化 a 并且我们有包含变量值的字段。我的疑问是,当我们创建 Integer 类时:

Integer i = 5;

它如何指向价值5?它不应该包含一个包含其值并指向Integer 对象的字段,例如:

static int value; // To hold value 5 for Integer class

【问题讨论】:

  • 我们不能在 Java 中声明像 Abc a = new Abc(); 这样的类。您正在创建一个对象
  • 这称为自动装箱,当您编写Integer i = 5;时,您的编译器在编译时将其更改为Integer i = Integer.valueOf(5);
  • 虽然这个问题只需要简单的研究,但投票并不是鼓励新用户的方式。你为什么不发表评论?
  • 对不起@Andrew 我弄错了。这可能是一个有用的链接stackoverflow.com/questions/9030817/…

标签: java wrapper boxing


【解决方案1】:

它如何指向值 5?

它指向一个持有原始值的Integer 实例。

Integer i = Integer.valueOf(5);

这是new Integer(5) 的优化版本(自Java 9 起已弃用)。该过程称为autoboxing,由编译器生成。

它不应该包含一个包含其值的字段吗?

它确实包含一个字段。不过,它不应该是静态的并且不应该为整个班级共享。

private final int value;

实际上,Integer.valueOf(5) 以及[-128, 127] 范围内的任何值都会从缓存中获取,除非指定了更大的java.lang.Integer.IntegerCache.high 值。

【讨论】:

  • 先生,最终变量不应该只在构造函数或非静态初始化器中初始化吗?
  • @Handmadegiftsco,是的,他们是。但是静态方法可以调用构造函数或引用另一个静态成员(查看static final Integer cache[] 内的private static class IntegerCache
【解决方案2】:

引用the Javadoc for Integer

Integer 类型的对象包含一个类型为 int 的字段。

所以是的,在自动装箱返回的对象中有一个int 类型的字段。自动装箱返回的Integer 对象可能是

  • 新建,或
  • 从缓存中返回;

但它将与Integer 类的静态valueOf 方法返回的对象相同。

answers to this question 可以帮助您了解valueOf(以及自动装箱)何时创建新对象,以及何时返回现有对象。

【讨论】:

    【解决方案3】:
    Integer i = 5;
    

    由此,编译器将生成Integer i = Integer.valueOf(5);(Autoboxing)

    另请参阅

    中的 Oracle 文档

    Autoboxing and Unboxing

    The Numbers Classes

    Immutable Objects

    【讨论】:

    • 先生,在这种情况下,像 i 这样的类的引用变量如何指向值?
    • 您不能通过引用传递包装类。因为是不可变的,所以你需要从你的方法中返回值。
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2013-06-21
    • 2021-11-15
    相关资源
    最近更新 更多