Java
初心者

【Java初心者】参照型を引数として渡したときの挙動

20190422追記

「参照渡し」への間違い部分に修正を入れています。

一部取り消し線で対応していますが、取り消し線での対応が難しい部分は大きく改変しています。(該当部分にはその旨を書いています)

追記ここまで

以前、【Java初心者】値渡しと参照の値渡し(”参照渡し”という言葉は誤解を生むとのことで修正しています)という記事を投稿したのですが、さらに詳しく知ることができたのでまとめます。


値渡しと参照の値渡し

メソッドの引数には、基本データ型も参照型も指定できます。しかし、どちらの型を使うかによって挙動がかわってきます。

基本データ型を指定した場合は値のコピーがメソッドに渡されます。値のコピーが渡されるので、メソッドの中で引数に対して行われた操作は、呼び出し元には影響しません。

参照型を指定した場合はその値の参照のコピーをメソッドに渡します。そのためメソッドの中で引数に対して行われた操作は、呼び出し元にも影響します。

ここまでが前回の記事の内容です(詳しくは【Java初心者】値渡しと参照の値渡し(”参照渡し”という言葉は誤解を生むとのことで修正しています)をどうぞ)。


参照の値渡し

基本的には上に書いたようなことなのですが、正確にいうと少し違うというか、誤解を与えてしまうかもしれません。

参照型の場合、参照情報を渡すので、メソッド内での操作は呼び出し元に影響を与えます。

このことを以下のサンプルで説明します。

参照の値渡し(参照のコピーを渡している)という部分を以下のサンプルで説明します。

まずはsample1です。


sample1


int[] array = {10,20,30};
System.out.println("呼び出し前:" + array[0]);
method(array);
System.out.println("呼び出し後:" + array[0]);

void method(int[] arrayInMethod){
arrayInMethod[0] = 100;
}



sample1の結果

呼び出し前:10

呼び出し後:100

続いて、sample2です。


sample2

int[] array = {10,20,30};

System.out.println("呼び出し前:" + array[0]);
method(array);
System.out.println("呼び出し後:" + array[0]);

void method(int[] arrayInMethod){
int[] nums = {100,200,300};
arrayInMethod= nums;
}



sample2の結果

呼び出し前:10

呼び出し後:10

追記:以下、大幅に改変しました。

sample2では、method内でarrayInMethodに新しく生成した配列であるnumsを入れています。

この操作により、メソッド内のarrayInMethodの参照先がarrayからnumsにかわっています。

もともと、arrayInMethodにはarrayの参照先のコピーが入っていましたが、numsの参照先のコピーが入るようになっただけなので、arrayには影響を与えません。

一方、sample1では、メソッド内のarrayInMethodが参照している先の値を書き換えています。

そのため、呼び出し元の変数のarrayにも影響が出ます。

追記ここまで


まとめ

参照にかかわる部分はとても難しいと感じました。特にJavaをやり始めた段階、Javaが初めて勉強する言語の場合、にはなかなか理解するのが難しいなと。

今度は「参照型」についてまとめたいと思います。(一番初めに書けばよかったですね。。。)