読者です 読者をやめる 読者になる 読者になる

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

参考資料