3

この例では、

int x = 5;
int y = x;
x = 4;

x は再割り当てされたばかりで、参照していたオブジェクトを操作していないため、y は 5 のままです。私の質問は、私が今言ったことは正しい考え方ですか?または、「x」に保存されているメモリの複製があり、その複製が「y」に入れられます。

4

3 に答える 3

8

プリミティブは、オブジェクトとは異なり、変数内に直接格納されます。つまり、プリミティブ型の変数はプリミティブへの参照を格納するのではなく、プリミティブの値を直接格納します。

1 つのプリミティブ変数が別のプリミティブ変数に割り当てられると、値がコピーされます。

あなたがするとき

int x = 5; int y = x; x = 4;

x内部の値を 4 に設定しますがy、値が別であるため、値は 5 のままです。

ある変数が別の変数への変更によって変更される唯一の方法は、両方の変数が「変更可能な」オブジェクトへの参照であり、オブジェクトが変更されている場合です。これは、両方の変数が自身のコピーではなく同じオブジェクトを見ているためです。 、両方とも同じ変化を観察します。(たとえば、文字列は不変であるため、「突然変更」されることはありませんが、配列とコレクションは可能であることに注意してください)

于 2013-05-13T06:52:13.003 に答える
2

と には 2 つの別々の場所がxありyます。xここにyはオブジェクトではなくプリミティブがあります。

あなたがするとき

int y = x;

int 変数用に別のメモリyが作成され、xieの値が5その場所にコピーされます。

この後、次のようにして変数に他の値を再割り当てした場合x:

x = 4;

の値には反映されませんy

Wrapper クラスを使用してもInteger、これらは不変クラスであるため、同様の方法で動作します。例えば:

Integer x = new Integer(5);
Integer Y = x; //now both `x` and `y` point to the same `integer` object with the value 5.
x= new Integer(4); // now since `x` is pointing to a different object than `y`, both `x` and `y` remain independent(i.e change in one does not reflect in another).   
于 2013-05-13T06:52:01.200 に答える
1

プリミティブ変数は実際には値を保持します (参照ではありません)。そのため、プリミティブ変数を作成するたびに、値を割り当てたかどうかに関係なく、(そのプリミティブ型の) メモリ ブロックが値用に予約されます。

(低レベル言語では、変数をレジスタと考えることができます)

于 2013-05-13T06:58:00.573 に答える