いじれないけど想像しなきゃ、な値「参照値」
初心者スレ等でみかけるハマってる人のハマりポイントで、「参照値を想像できていない」ってのがあるように感じた。参照値(=あるいは単に参照)ってちょっと想像しにくいんだよね。
「じゃあ、それを見える化してみよう」という試み。(図に描いてみるっていうだけだけどね。)
int val = 123; String str = "あいうえお";
2つの変数を宣言して、初期化もしてるところ。
これをやると、メモリ内ではこんな風になる。
┌──────┐ val:│ 123 │ └──────┘ ┌──────┐ +〜〜〜〜〜〜+ str:│ 参照──┼───>│ あいうえお │ └──────┘ +〜〜〜〜〜〜+
変数 val と 変数 str ではかなり違う。
変数 val は、123 を直接持っているけれど、変数 str は、「あいうえお」を直接は持たずに、参照というものを通して間接的に持っている。
これは int 型と String 型の話というよりは、プリミティブ型と参照型の違いだ。
ここで誰かが「変数 val に入っている値は何?」と質問したとすると、答えは「123」で正解だけど、「変数 str に入っている値は何?」と聞かれた場合は、厳密な意味では「あいうえお」は正解ではない。厳密な意味での正解は、「参照値」となる。
「その参照値が指しているものは何?」と聞かれて初めて「『あいうえお』を内部に持っている String クラスのインスタンス」と言える。
上の図では、カチッとした四角で変数を、もやもやとした雲の形でインスタンスを表現したかった。テキストでは雲が描けないので、「〜」で代用した。
C言語では、ポインタというものが参照とほぼ同じ役割を果たしているけれど、C言語のポインタと比べて Java の参照は自分でいじったり表示したりできないので、その存在自体が忘れられたり、そもそも存在しないと思われちゃったりしてしまいがちかも。
やっぱり Java でもポインタは鬼門だ。