>> Java入門トップに戻る

インスタンスの参照

Javaのインスタンスの参照について説明します。

クラスを利用する時はインスタンスを生成してそのインスタンスを変数に代入して利用していましたが、その変数にはどんな値が入っていたか知っていますか?
そのままインスタンスが入ってるとイメージしていたと思いますが、実際には「そのインスタンスがある場所を示す値」が入っていたんです。
インスタンスが生成されるとメモリ上にその領域が確保され、そこにインスタンスが作成されるんですが、変数に代入されるのはその場所だったんです。
このインスタンスの場所を表す値のことを「参照」と言います。

では、その参照が代入されていることを証明するコードをお見せします。
package test6;

public class Sansho {
	public int value=0;
	public static void main(String[] args) {
		
		//インスタンスを生成
		Sansho obj = new Sansho();
		
		//別の変数に代入
		Sansho obj2 = obj;
		
		//最初にインスタンスを代入した変数からフィールドの値を書き換え
		obj.value=10;
		
		//出力
		System.out.println(obj.value);
		//もう一方も出力
		System.out.println(obj2.value);
		
	}
	

}
上記のコードでは8行目でインスンタンスを生成して変数に代入し、11行目で別の変数に代入しています。
14行目では「最初にインスタンスを代入した変数」からフィールドvalueの値に10を設定しています。
その後、17~19行目で両方の変数からフィールドvalueの値を出力しています。
この時コンソールにはどのように出力されるでしょうか?
実は両方共「10」と出力されます。

何故なら11行目で別の変数に代入されたのは、「インスタンスの参照」だからです。
つまり両方の変数には同じ参照が入っており、その参照が示す場所は同じインスタンスになるわけです。
なので両方値が書き換わったように見えた、というわけなんです。

そのままインスタンス自体をコピーしたらいいじゃん、って思う人がいるかもしれませんが、別の変数に代入するたびにインスタンスをコピーしていてはメモリの無駄です。
なので「参照」が使われているというわけなんです。

今回のようにインスタンスの参照が入った変数を別の変数に代入してもインスタンス自体がコピーされるわけじゃないということがわかりました。
本当にインスタンス自体を複数作成したい場合は、11行目の部分で「もう一度newして別のインスタンスを生成」してください。

以上で説明は終わりですが、この事実を知っておかないと思いもよらないバグに遭遇することもあるので忘れないように覚えておいてください。

>> 【クラス、フィールド、メソッドのアクセス修飾子】に進む
>> Java入門トップに戻る