他の誰もが参照とプリミティブの違いを説明したので、これが表面下でどのように機能するかを説明します。
したがって、オブジェクトへの参照は本質的に数値です。VM に応じて、32 ビットまたは 64 ビットのいずれかになりますが、それでも数値です。この数字は、オブジェクトがメモリ内にあったことを示しています。これらの数値はアドレスと呼ばれ、通常は 16 進数で表記されます0xYYYYYYYY
(これは 32 ビット アドレスの例で、64 ビット アドレスは 2 倍になります)。
32ビットVMを使用して上記の例を使用しましょう
a.setColor(blue); // Let's assume the object pointed to by a is at 0x00000001
b.setColor(red); // Let's assume the object pointed to by b is at 0x00000010
/* Now the following makes sense, what happens is the value of
a (0x00000001) is overwritten with 0x00000010.
This is just like you would expect if a and b were ints.
*/
a = b; // Both a and b have the value 0x00000010. They point to the same object
b.setColor(purple); // This changed the object stored at 0x00000010
b = a; // This says nothing because both a and b already contain the value 0x00000010
これは、2 番目の例で示したように、参照が数字のように機能することを示しているはずです。ただし、表面下でのみ、プログラマに関する限り、参照の割り当てはプリミティブの割り当てのようには機能しません。
Java では、オブジェクトのアドレスなどについて心配する必要はありません。低レベルのアクセスを可能にする C や C++ のような言語では、これはより明白で重要になります。
算数?では、算数やその他の数値でできることはできますか? 短い答えはノーです。少なくともJavaではそうではありません。
ただし、C および C++ では、オブジェクトへのポインターのインクリメントおよびデクリメントは完全に有効であり、たとえば配列のトラバースなどによく使用されます。
これが十分に明確でない場合は、遠慮なく質問してください。