LoginSignup
48

More than 3 years have passed since last update.

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

Last updated at Posted at 2014-06-08

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が初めて勉強する言語の場合、にはなかなか理解するのが難しいなと。

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48