我对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
答案 0 :(得分:1)
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