いじれないけど想像しなきゃ、な値「参照値」

初心者スレ等でみかけるハマってる人のハマりポイントで、「参照値を想像できていない」ってのがあるように感じた。参照値(=あるいは単に参照)ってちょっと想像しにくいんだよね。
「じゃあ、それを見える化してみよう」という試み。(図に描いてみるっていうだけだけどね。)

		int val = 123;
		String str = "あいうえお";

2つの変数を宣言して、初期化もしてるところ。
これをやると、メモリ内ではこんな風になる。

    ┌──────┐
val:│    123     │
    └──────┘
    ┌──────┐       +〜〜〜〜〜〜+
str:│    参照──┼───>│ あいうえお │
    └──────┘       +〜〜〜〜〜〜+

変数 val と 変数 str ではかなり違う。
変数 val は、123 を直接持っているけれど、変数 str は、「あいうえお」を直接は持たずに、参照というものを通して間接的に持っている。
これは int 型と String 型の話というよりは、プリミティブ型と参照型の違いだ。
ここで誰かが「変数 val に入っている値は何?」と質問したとすると、答えは「123」で正解だけど、「変数 str に入っている値は何?」と聞かれた場合は、厳密な意味では「あいうえお」は正解ではない。厳密な意味での正解は、「参照値」となる。
「その参照値が指しているものは何?」と聞かれて初めて「『あいうえお』を内部に持っている String クラスのインスタンス」と言える。

上の図では、カチッとした四角で変数を、もやもやとした雲の形でインスタンスを表現したかった。テキストでは雲が描けないので、「〜」で代用した。

C言語では、ポインタというものが参照とほぼ同じ役割を果たしているけれど、C言語のポインタと比べて Java の参照は自分でいじったり表示したりできないので、その存在自体が忘れられたり、そもそも存在しないと思われちゃったりしてしまいがちかも。

やっぱり Java でもポインタは鬼門だ。

keywords:Java | 見える化 | C言語 | ポインタ | インスタンス