20190422追記
「参照渡し」への間違い部分に修正を入れています。
一部取り消し線で対応していますが、取り消し線での対応が難しい部分は大きく改変しています。(該当部分にはその旨を書いています)
追記ここまで
以前、【Java初心者】値渡しと参照の値渡し(”参照渡し”という言葉は誤解を生むとのことで修正しています)という記事を投稿したのですが、さらに詳しく知ることができたのでまとめます。
##値渡しと参照の値渡し
メソッドの引数には、基本データ型も参照型も指定できます。しかし、どちらの型を使うかによって挙動がかわってきます。
基本データ型を指定した場合は値のコピーがメソッドに渡されます。値のコピーが渡されるので、メソッドの中で引数に対して行われた操作は、呼び出し元には影響しません。
参照型を指定した場合はその値の参照のコピーをメソッドに渡します。そのためメソッドの中で引数に対して行われた操作は、呼び出し元にも影響します。
ここまでが前回の記事の内容です(詳しくは【Java初心者】値渡しと参照の値渡し(”参照渡し”という言葉は誤解を生むとのことで修正しています)をどうぞ)。
##参照の値渡し
基本的には上に書いたようなことなのですが、正確にいうと少し違うというか、誤解を与えてしまうかもしれません。
参照型の場合、参照情報を渡すので、メソッド内での操作は呼び出し元に影響を与えます。
このことを以下のサンプルで説明します。
参照の値渡し(参照のコピーを渡している)という部分を以下のサンプルで説明します。
まずは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;
}
呼び出し前:10
呼び出し後:100
続いて、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;
}
呼び出し前:10
呼び出し後:10
追記:以下、大幅に改変しました。
sample2では、method内でarrayInMethod
に新しく生成した配列であるnums
を入れています。
この操作により、メソッド内のarrayInMethod
の参照先がarray
からnums
にかわっています。
もともと、arrayInMethod
にはarray
の参照先のコピーが入っていましたが、nums
の参照先のコピーが入るようになっただけなので、array
には影響を与えません。
一方、sample1では、メソッド内のarrayInMethod
が参照している先の値を書き換えています。
そのため、呼び出し元の変数のarray
にも影響が出ます。
追記ここまで
##まとめ
参照にかかわる部分はとても難しいと感じました。特にJavaをやり始めた段階、Javaが初めて勉強する言語の場合、にはなかなか理解するのが難しいなと。
今度は「参照型」についてまとめたいと思います。(一番初めに書けばよかったですね。。。)