考えてみてください。Java プリミティブは、実際の値をメモリ バイト領域に保持します。したがって、a = 4
とb = 3
の場合、8 バイトのマシン メモリ領域は (バイナリで) のようにそれを保持できます。
a = 0 0 0 0 0 0 1 1
b = 0 0 0 0 0 0 1 0
今、あなたが言うときa=b;
は
a = 0 0 0 0 0 0 1 0
b = 0 0 0 0 0 0 1 0
それでb++ (i.e. b = b+1)
a = 0 0 0 0 0 0 1 0
b = 0 0 0 0 0 0 1 1
それで
return a;
Then a = 0 0 0 0 0 0 1 0 (i.e. 3)
プリミティブな値としてご理解いただければ幸いです。ただし、Java のオブジェクトの場合、これはまったく別のケースです。
ここで、a と b はプリミティブではなく、int フィールドを持つオブジェクトだと考えてください。Sample クラスは次のようになります。
class Test {
private int value;
public Test(int value){
this.value = value;
}
public int getValue(){
return value;
}
public int increment(){
value++;
}
}
次にa = new Test(4); and b = new Test(3);
、メモリ内で次のように表されます。
ヒープ:
a = x63489DF8 ---> [Test(4) Object, value = 4, Heap Memory address = x63489DF8]
b = xDFA78945 ---> [Test(3) Object, value = 3, Heap Memory address = xDFA78945]
(a
そしてb
、オブジェクトを指すヒープメモリアドレスを保持します)
今、あなたが言うときa=b;
は
a = xDFA78945 ---> [Test(3) Object value = 3, Heap Memory address = xDFA78945]
b = xDFA78945 ---> [Test(3) Object value = 3, Heap Memory address = xDFA78945]
(メモリ アドレス内のオブジェクトx63489DF8
はガベージ コレクション可能でありa, b
、同じオブジェクトを参照しています)
ここで、b と言うと.increment();
、メモリ領域内のオブジェクトxDFA78945
が操作され、新しいオブジェクトは になり[Test(3) Object value = 4, Heap Memory address = xDFA78945]
ます。
a = xDFA78945 ---> [Test(3) Object value = 4, Heap Memory address = xDFA78945]
b = xDFA78945 ---> [Test(3) Object value = 4, Heap Memory address = xDFA78945]
(どちらも実際には同じオブジェクトを指しているため、変更は両方の参照を反映していることに注意してください)
returna.getValue()
は 4 を返すようになりました (つまり、参照によって行われた変更b
は、参照にも反映さa
れます) 。