Java 包装器 class 指向原始值的引用

Java Wrapper class reference pointing to a primitive value

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

Abc a = new Abc(); 

它实例化了一个参考 Abc class 并且我们有包含变量值的字段。我的疑问是,当我们创建 Integer class 时:

Integer i = 5;

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

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

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

另请参阅

中的 Oracle 文档

Autoboxing and Unboxing

The Numbers Classes

Immutable Objects

引用the Javadoc for Integer

An object of type Integer contains a single field whose type is int.

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

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

但它将与Integerclass.

的静态valueOf方法返回的对象相同

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

How is it pointing to value 5?

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

Integer i = Integer.valueOf(5);

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

Should not it contain a field which contains its value?

它确实包含一个字段。不过,它不应该是静态的,也不应该为整个 class.

共享
private final int value;

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