LoginSignup
13

More than 5 years have passed since last update.

Java入門 値渡しと参照渡し

Last updated at Posted at 2014-08-09

Java入門
値渡しと参照渡し

値渡し

sample.java
メソッド名(変数名)

この場合、変数そのものが渡されるのではなく、実引数が仮引数にコピーされます。
値そのものが渡されることを値渡しと呼びます。
渡される値はあくまでコピーなので、呼び出し先の引数の中身を書き換えても、呼び出し元の値は変化しません。

参照渡し

変数を指定すると値ではなく、そのコピーが渡されました。
しかし、配列では値のコピーではなく、配列の先頭のアドレスが渡されます。

sample.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);
        }
    }
}

実行結果

sample.java
2
3
4

return文を使って、結果をmainメソッドに返さなくても、配列の中身は変更されました。

戻り値に配列を使う

戻り値は変数だけでなく、配列も可能

sample.java
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);
        }
    }
}

実行結果

sample
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言語から入った人間だからでしょうか、参考書を読み、「参照渡し・・・あぁ、ポインタね!」と勝手に思い込んでいたようです。

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
13