指向原始值的Java Wrapper类引用

时间:2018-03-13 10:09:02

标签: java wrapper boxing

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

Abc a = new Abc(); 

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

Integer i = 5;

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

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

3 个答案:

答案 0 :(得分:1)

引用the Javadoc for Integer

  

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

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

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

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

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

答案 1 :(得分: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值。

答案 2 :(得分:0)

Integer i = 5;

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

另见

中的Oracle Docs

Autoboxing and Unboxing

The Numbers Classes

Immutable Objects