2013-06-25 49 views
1
Integer x = 400; 
Integer y = x; 
x++; 

此时x是401,y是400.But我认为两者都指的是同一对象,都应该是401 我不知道这是怎么happening.please帮助。如何包装类作品

+0

标题似乎误导,我想你需要看到这个http://stackoverflow.com/questions/4712798/how-to-use-references-in-java或http://stackoverflow.com/questions/40480/is-java-pass-by-reference –

+0

http://stackoverflow.com/questions/13098143/java-integer-constant-pool – Santosh

回答

7

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

+1

+1由于自动装箱,它可能不会创建一个新的Integer ,但它将是一个不同的Integer。例如'-XX:+ AggressiveOpts'可以将Integer缓存增加到10K或20K –

+0

谢谢...知道了吧 –

+0

请看看我的答案,它证明来自不同的完美。 –

0

整数是不可变的。所以,当你复制一些值它是创建对象的新实例

1

Java中的所有包装类immutable。所以objectinstance创建每个时间。 当然为每个实例携带不同的值。

2

Opcode说的都是。

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 
} 
+0

谢谢...你能请给我打电话更多关于操作码..它描述什么..如何得到这段代码 –

+0

> javap -c WrapperTest.class打印Java编译代码。 Opcode就像一个由JVM执行的机器语言。 JVM执行此代码。 –

0

这里在此图像中,当你增加X值= X + 1,那么它会创建新的参考而不是指向同一one.So递增X的值之后,X将指向401.Andÿ将指向400,因为Y不会递增。

Check This