为什么 increment in reference of integer class 对象操纵整数值?

why is increment in reference of integer class object manipulates integer value?

我有一个基本的疑问,我们可以增加 Integer class 对象的引用,而不能引用任何其他 class(D class 有 1 个 Integer 数据成员和一个参数化构造函数)。

Integer x=new Integer(10); x++;
    D d=new D(10); d++;

这里 x 和 d 都是引用,我们仍然可以增加整数引用,而不是任何其他引用。我缺少一些非常基本的东西,请帮帮我。

这是因为包装器 类 的自动装箱是从 jdk 1.5 引入的。在内部 java 会将整数引用转换为 int 并递增它。您不能增加对象。

Integer x=new Integer(10); x++;

此处java 编译器将执行对象的un-boxing,将Integer 对象转换为原始int。然后将执行增量操作。这仅适用于 java 基元,auto-boxing 正在将基元转换为包装对象,其逆向调用 un-boxing。这就是这里发生的事情。

auto-boxingun-boxing 是一个自动转换,它只为 java 原语定义。所以不能对其他对象执行。请记住,对象不仅仅是像 C or C++ 这样我们可以递增它们的内存引用。

Java 无法为任意 类 重载运算符。因此,D d; d++ 不可用。你可以这样做:

public class D {
    private int value;
    public D( int v ){
        value = v;
    }

    public void increment(){
        value++;
    }
}

现在你可以做

D d = new D(10);
d.increment();

d 的值为 11。

根据Oracle Java Documentation,将原始数据类型自动转换为其等效包装类型称为autoboxing,而相反的操作称为unboxing。每当我们在表达式中使用包装器 class 的对象时,自动拆箱和自动装箱由 JVM 完成。

Integer object;
object = 100;        //Autoboxing of int
++object;

当我们对Integer对象进行自增操作时,会先拆箱,自增,再重新装箱成Integer类型的对象。你也可以看看How java auto boxing/unboxing works?