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.So毎回作成の新しいinstanceですobject。もちろん、インスタンスごとに異なる値を持ちます。

于 2013-06-25T06:44:15.630 に答える
0

整数は不変です。したがって、いくつかの値をそれにコピーすると、オブジェクトの新しいインスタンスが作成されます

于 2013-06-25T06:43:12.380 に答える
0

ここで、この画像では、X=X+1 の値をインクリメントすると、同じ参照を指すのではなく、新しい参照が作成されます。したがって、X の値をインクリメントした後、X は 401 を指し、Y は 400 を指します。インクリメントされません。

これをチェックして

于 2013-06-25T07:05:30.280 に答える