1
Integer x = 400;
Integer y = x;
x++;

此时x是401,y是400。但我认为两者都指的是同一个对象,都应该是401。我不知道这是怎么回事。请帮忙。

4

5 回答 5

7

因为x++实际上与 相同x = x + 1x + 1是一个不同 Integer的对象,并被x更新以引用另一个对象。

于 2013-06-25T06:41:45.247 回答
2

操作码说明一切。

package wrapperInteger;

public class WrapperTest {


public static void main(String[] args) {

    Integer x =400;
    Integer y=x;
    x++;
    y--;


}

}

操作码:

如果你意识到 x 对应 #16 并且 y 对应 #22。所以它证明了两个变量都指向不同的对象。

Compiled from "WrapperTest.java"
public class wrapperInteger.WrapperTest extends java.lang.Object{
public wrapperInteger.WrapperTest();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   sipush  400
   3:   invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   6:   astore_1
   7:   aload_1
   8:   astore_2
   9:   aload_1
   10:  invokevirtual   #22; //Method java/lang/Integer.intValue:()I
   13:  iconst_1
   14:  iadd
   15:  invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   18:  astore_1
   19:  aload_2
   20:  invokevirtual   #22; //Method java/lang/Integer.intValue:()I
   23:  iconst_1
   24:  isub
   25:  invokestatic    #16; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   28:  astore_2
   29:  return
}
于 2013-06-25T06:56:25.530 回答
1

java中的所有包装类都是.所以每次都会创建immutable一个新instance的。object当然,每个实例都有不同的价值。

于 2013-06-25T06:44:15.630 回答
0

在此图像中,当您增加 X=X+1 的值时,它将创建新的引用而不是指向同一个引用。因此,在增加 X 的值后,X 将指向 401。Y 将指向 400,因为 Y 是不增加。

检查这个

于 2013-06-25T07:05:30.280 回答
0

整数是不可变的。因此,当您向其中复制一些值时,它会创建对象的新实例

于 2013-06-25T06:43:12.380 回答