Java入門
値渡しと参照渡し
##値渡し
メソッド名(変数名)
この場合、変数そのものが渡されるのではなく、実引数が仮引数にコピーされます。
値そのものが渡されることを値渡しと呼びます。
渡される値はあくまでコピーなので、呼び出し先の引数の中身を書き換えても、呼び出し元の値は変化しません。
##参照渡し
変数を指定すると値ではなく、そのコピーが渡されました。
しかし、配列では値のコピーではなく、配列の先頭のアドレスが渡されます。
public class Sample {
// 配列の要素すべてに1を加えて返すメソッド
public static void incArray(int[] array) {
for (int i = 0; i < array.length; i++) {
array[i] ++;
}
}
public static void main(String[] args) {
int[] array = {1, 2, 3};
incArray(array);
for (int value : array) {
System.out.println(value);
}
}
}
実行結果
2
3
4
return文を使って、結果をmainメソッドに返さなくても、配列の中身は変更されました。
##戻り値に配列を使う
戻り値は変数だけでなく、配列も可能
public class Sample {
// int型の配列を作成して返す。
// sizeは要素数を受け取る。
public static int[] makeArray(int size) {
int[] newArray = new int[size];
for (int i = 0; i < newArray.length; i++) {
newArray[i] = i;
}
// 配列そのものではなく、配列の先頭アドレスを返している。
return newArray;
}
public static void main(String[] args) {
int[] array = makeArray(5);
for (int value : array) {
System.out.println(value);
}
}
}
実行結果
0
1
2
3
4
着目すべきところはmakeArrayメソッドです。これは配列を制作して返す。つまり仮引数として配列を受け取るわけではないので、仮引数には[]を付けずに、***public static int[]***とする。
プログラムの流れは
1.mainメソッドの int[] array = makeArray(5) で作りたい配列の要素数を実引数として指定する。
2.makeArrayで要素数をint sizeとして受け取り、arrayという配列を制作する。
3.繰り返し文で配列を初期化処理(この処理がなければすべて0で初期化される)
4.mainメソッドに配列の先頭のアドレスを返す。
5.arrayにmakeArray配列の先頭のアドレスを格納する。
6.配列の数だけ繰り返し処理して画面に出力する。
変数ではなく配列を返すのでmakeArrayメソッドはint[]型であり、returnは不要となる。
2014/08/10
参照渡しについて幾つかコメントを頂きました。
どうもJavaは正確には「参照の値渡し」であり、いわゆる参照渡しは存在しないとのことでした。
C言語から入った人間だからでしょうか、参考書を読み、「参照渡し・・・あぁ、ポインタね!」と勝手に思い込んでいたようです。