Thinkers'Studio
JavaとC言語の自習ツール
値渡しと参照渡し(Java版)

メソッドの値渡しと参照渡し

 メソッド引数で値を渡すときの方法には、「値渡し(あたいわたし)」と「参照渡し」があります。
 Java では、基本データ型のときは値渡し配列やオブジェクトのときは参照渡しと決まっています。

値渡しは ・・・

 変数や定数の値のコピーがメソッドに渡されます。
 そのため値渡しでは、受け取ったメソッドでその値を書き換えても元の変数(や定数)の値は変わりません。

参照渡しは ・・・

 オブジェクトの在り場所を渡す方法です。
 そのため参照渡しでは、メソッドでその場所の値を書き換えることができます。

(今回のクイズです)
 変数の3倍の値を求めるメソッドを Aさんと B さんに書かせました。
 main でそれらを呼び出し、結果を表示するプログラムです。
class SampleMethod {
    void A_multi_3( int x ) {
        x *= 3;
    }
    int B_multi_3( int x ) {
        x *= 3;
        return x;
    }
}

class CheckSample {
    public static void main( String[] args ) {
        SampleMethod c = new SampleMethod();
        int x = 1;
        c.A_multi_3( x );
        System.out.println( "Aさんメソッドの結果: " + x );
        x = 1;
        System.out.println( "Bさんメソッドの結果: " + c.B_multi_3( x ) );
    }
}
 プログラムを実行すると、結果はどうなるでしょうか? また、その理由は?
  (答えは、次回の Java の Tips で ・・・)
前回のクイズの答え:  for文の後ろに空文があるためです。  (前回の問題を見る
下は、同じ処理を見慣れた形にしました。空文を次の行に移しただけです。
for( i = 0; i < sorted.length && sorted[i] >= 80; i++ )
    ;                                       /* 繰り返しの度に実行される(何もしない) */
    System.out.println( sorted[i] + "点" ); /* forの後1度だけ実行 */
うっかりセミコロンをつけたので、System.out.println 行は、繰り返しを抜けた後に実行されます。結局 forでは、sorted配列を調べ、点数が 80点未満になるところまで i を進めるだけです。その後で sorted[i] を表示するので、78点と出力されたのです。

このクイズは間違えて空文を入れた例なので、セミコロン ; を取るとうまくいきますが、繰り返しの本体でわざと空文を使うケースもあります。