20190422追記
「参照渡し」への間違い部分に修正を入れています。
当時の私がそうであったように初心者は「参照渡し」という言葉でググるだろうという予想から、タイトル長くなってしまっているのですが、このようなタイトルにしています。
一部取り消し線で対応していますが、取り消し線での対応が難しい部分は大きく改変しています。(該当部分にはその旨を書いています)
追記ここまで
Java歴約1年、まだまだ初心者です。
今日は値渡しと参照渡し参照の値渡しについてまとめようと思います。
##メソッドの引数
メソッドの引数には、基本データ型、参照型のどちらも使用できます。
しかし、どちらの型を使うかによって、挙動が変わってきます。
##基本データ型
呼び出し元でメソッドの引数に基本データ型を使用した場合、メソッドではその値のコピーを受け取ります。
これを 値渡しといいます。
単純に値のコピーを渡しているだけなので、メソッド内でその値に変更を加えても、呼び出し元には影響しません。
// class宣言等は省略
int num = 10;
methodA(num);
System.out.println(num); // 10が出力されます
void methodA(int num){
num += 10;
System.out.println(num); // 20が出力されます
}
##参照型
呼び出し元でメソッドの引数に参照型を使用した場合、メソッドではその値への参照を受け取ります 参照のコピーを受け取ります 。
これを 参照渡しといいます。
参照している先をたどると、同じ場所を参照しているため、メソッド内で値へ変更を加えると呼び出し元にも影響を与えます。
// class宣言等は省略
int[] num = {10,20};
methodB(num);
System.out.println(num[0]); // 20が出力されます
void methodB(int[] num){
num[0] += 10;
System.out.println(num[0]); // 20が出力されます
}
追記
C++、C#、PHP等では「参照渡し」という呼ばれる挙動があり、Javaで言われている「参照渡し」とは挙動が異なります。
Javaで言われている「参照渡し」は「参照の値渡し」と呼ぶ方もいるようです。とはいえ、この挙動をどう呼ぶかは様々なところで議論されており・・・ 統一した呼び方がないのが現状です。
(そもそもJavaではすべて値渡しなので、参照という言葉が出ることがおかしいという意見もあります)。
この記事では「参照の値渡し」と表現させていただきました。
ここまで追記
##では以下は?
以下のコードではどうなるでしょう?
// class宣言等は省略
String text = "A";
methodC(text);
System.out.println(text); // ②
void methodC(String text){
text = "B";
System.out.println(text); // ①
}
正解は ①B ②A です。
String型は参照型なので、これまでの話の通り行くと②でもBが出力されそうです。
しかし、String型のインスタンスはimmutableであるため、値の書き換えを行うことができません。
そのため、メソッド内で値の変更をしても呼び出し元に影響がないのです。
String型についてはまた別記事にしようと思います。
2014年6月8日追記
参照渡し参照の値渡しについて別途まとめました。
【Java初心者】参照渡しのまとめ