指向基元值的Java包装器类引用
我对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 由此
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)虽然这个问题只需要简单的研究,但向下投票并不是鼓励新用户的一种方式。你为什么不留言?对不起,安德鲁,我弄错了。这可能是一个有用的链接,先生,像我这样的类的引用变量在本例中如何指向值?您不能通过引用传递包装器类。因为它们是不可变的,因此,您需要从方法返回值。先生,最终变量不应该仅在构造函数或非静态初始值设定项中初始化吗?@saffedegiftsco,是的,它们是。但是静态方法可以调用构造函数或引用另一个静态成员(查看静态最终整数缓存[]
内部私有静态类IntegerCache
)
private final int value;