Integer x = 400;
Integer y = x;
x++;
此时x是401,y是400.但我认为两者都指的是同一个对象,两者都应该是401。 我不知道这是怎么回事。请帮助。
答案 0 :(得分:7)
因为x++
实际上与x = x + 1
相同。 x + 1
是不同的 Integer
对象,并且x
已更新以引用此其他对象。
答案 1 :(得分: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
}
答案 2 :(得分:1)
java中的所有包装类都是immutable
。因此每次都会创建instance
的新object
。
当然,每个实例都有不同的价值。
答案 3 :(得分:0)
整数是不可变的。因此,当您向其复制某些值时,它正在创建对象的新实例
答案 4 :(得分:0)
这里在这个图像中,当你增加X = X + 1的值时,它会创建新的引用,而不是指向同一个。所以在递增X的值后,X将指向401.Y将指向400因为Y没有增加。