Integer x = 400;
Integer y = x;
x++;
この時点で、x は 401 で y は 400 です。しかし、両方とも同じオブジェクトを参照しており、両方とも 401 である必要があると思います。これがどのように起こっているのかわかりません。助けてください。
Integer x = 400;
Integer y = x;
x++;
この時点で、x は 401 で y は 400 です。しかし、両方とも同じオブジェクトを参照しており、両方とも 401 である必要があると思います。これがどのように起こっているのかわかりません。助けてください。
x++
は実質的に と同じだからですx = x + 1
。 x + 1
は別 Integer
のオブジェクトであり、x
この別のオブジェクトを参照するように更新されます。
オペコードがすべてを語っています。
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
}
Javaのすべてのラッパークラスはimmutable
.So毎回作成の新しいinstance
ですobject
。もちろん、インスタンスごとに異なる値を持ちます。
整数は不変です。したがって、いくつかの値をそれにコピーすると、オブジェクトの新しいインスタンスが作成されます
ここで、この画像では、X=X+1 の値をインクリメントすると、同じ参照を指すのではなく、新しい参照が作成されます。したがって、X の値をインクリメントした後、X は 401 を指し、Y は 400 を指します。インクリメントされません。