繁体   English   中英

指向原始值的Java Wrapper类引用

[英]Java Wrapper class reference pointing to a primitive value

我对Java包装器类(例如IntegerCharacter有疑问。 我知道当我们声明一个类Abc并可以在Java中为其创建对象时

Abc a = new Abc(); 

它通过引用Abc类实例化a,因为我们有包含变量值的字段。 我的疑问是,当我们创建Integer类时,如下所示:

Integer i = 5;

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

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

引用Javadoc for Integer

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

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

  • 新创建的,或
  • 从缓存返回;

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

问题的答案可能有助于您了解valueOf (并因此自动装箱)何时创建新对象以及何时返回现有对象。

它如何指向价值5?

它指向一个保存该原始值的Integer实例。

Integer i = Integer.valueOf(5);

这是new Integer(5)优化版本new Integer(5)自Java 9开始不推荐使用)。 该过程称为自动装箱 ,由编译器完成。

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

它确实包含一个字段。 但是,它不应该是静态的,并在整个类中共享。

private final int value;

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

Integer i = 5;

由此,编译器将使Integer i = Integer.valueOf(5); (自动装箱)

另请参阅

自动装箱和拆箱

数字类

不变的对象

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM