Javaの参照について
概要
Java - もう参照渡しとは言わせない - Qiitaの指摘どおり、恥ずかしながら、C++の「参照渡し」とごっちゃになっていました。
C++言語の場合
関数に引数を渡す場合、値渡しと参照渡しがあります。
int arg = 1; methodA(arg); // argの値は、1 methodB(&arg); // argの値は2 // 値渡し void methodA(int arg) { arg = 2; } // 参照渡し void methodB(int *arg) { *arg = 2; }
Java言語の場合
Java言語仕様 Chapter 4. Types, Values, and Variables には以下のように記述されています。
An object is a class instance or an array.
The reference values (often just references) are pointers to these objects, and a special null reference, which refers to no object.
オブジェクトとは、クラスインスタンス、あるいは配列である。
参照値(参照)は、オブジェクトへのポインタであり、特別なnull参照は、オブジェクトを参照しない。
例
実際に、サンプルコードを作成し確認します。
public static void main(String[] args) { int[] a = {1, 2, 3}; System.out.println(a); int[] b = a; System.out.println(b); } // 結果 [I@60e53b93 [I@60e53b93
ここで、[I@60e53b93は、{1, 2, 3}のオブジェクトを表しており、int配列、オブジェクトidが60e53b93であることを示しています。
変数a、bともにint配列{1, 2, 3}を参照しています。
これは、関数にしても同じです。したがって、関数内でオブジェクト(例の場合。int配列)を修正すると関数外でも反映されます。
static void doFunction(int[] array) { System.out.println(array); array[0] = 0; } public static void main(String[] args) { int[] a = {1, 2, 3}; System.out.println(a); System.out.println("a[0] = " + a[0]); doFunction(a); System.out.println("a[0] = " + a[0]); } // 結果 [I@60e53b93 a[0] = 1 [I@60e53b93 a[0] = 0