指向基元值的Java包装器类引用

指向基元值的Java包装器类引用,java,wrapper,boxing,Java,Wrapper,Boxing,我对Java包装类有疑问,比如Integer,Character。我知道当我们声明一个类Abc时,可以像Java一样为它创建一个对象 Abc a = new Abc(); 它引用Abc类实例化一个类,其中我们有包含变量值的字段。我的疑问是,当我们创建Integer类时: Integer i = 5; 它是如何指向值5?它不应该包含包含其值并指向Integer对象的字段,如: static int value; // To hold value 5 for Integer class 由此

我对Java包装类有疑问,比如
Integer
Character
。我知道当我们声明一个类
Abc
时,可以像Java一样为它创建一个对象

Abc a = new Abc(); 
它引用
Abc
类实例化一个类,其中我们有包含变量值的字段。我的疑问是,当我们创建
Integer
类时:

Integer i = 5;
它是如何指向值
5
?它不应该包含包含其值并指向
Integer
对象的字段,如:

static int value; // To hold value 5 for Integer class
由此,编译器将使
Integer i=Integer.valueOf(5)(自动装箱)

另请参见中的Oracle文档

引用

整型对象包含一个整型字段

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

  • 新创建的,或
  • 从缓存返回
但它将与
Integer
类的静态
valueOf
方法返回的对象相同

可以帮助您了解
valueOf
(因此自动装箱)何时创建新对象以及何时返回现有对象

它是如何指向值5的

它指向一个
Integer
实例,该实例保存该原语值

Integer i = Integer.valueOf(5);
这是新整数(5)
的一个稍微优化的版本(这一版本自Java9以来就被弃用)。该过程由编译器调用和生成

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

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

private final int value;

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

我们不能像Abc a=new Abc();,在Java中。您正在创建一个对象,当您编写
整数i=5时,这称为自动装箱Integer i=Integer.valueOf(5)静态最终整数缓存[]
内部
私有静态类IntegerCache
private final int value;