メソッドと引数を理解する
メソッドは名前を付けた処理のまとまりです。引数として値を受け取り、必要なら結果を返します。呼出し元の変数と受取側の変数を区別すると、値渡しの仕組みが分かります。例のstaticメソッドはMainクラス内、呼出しはmain内に置きます。
この単元で学ぶこと
- メソッド宣言と呼出しを対応させる
- 実引数と仮引数を区別する
- プリミティブ値・参照値の値渡しを説明する
本文解説
処理に名前を付ける static int add(int a,int b){return a+b;}は、intを二つ受け取り、その和をintで返すメソッドです。add(2,3)の値は5なのでSystem.out.print(add(2,3));は5を表示します。addが名前、int aとint bが仮引数、最初のintが戻り値の型です。宣言しただけでは本体は実行されません。
実引数と仮引数 add(x,y)のxやyは呼出し時に評価する実引数です。値を受け取るaやbは別の変数で、名前は一致しなくても構いません。引数の位置が対応を決めます。static int sub(int a,int b){return a-b;}ではsub(8,3)は5、sub(3,8)は-5です。型が同じでも順番が違えば意味が変わります。
プリミティブ値はコピー static void change(int n){n=9;}をint x=2;change(x);のように呼んでもxは2です。xの値2を仮引数nへコピーし、そのnだけを書き換えます。呼出し元へ数値の変更を伝えたいなら戻り値を用意してx=next(x)のように受け取る設計にします。
参照値もコピー static void change(int[] a){a[0]=9;}にint[] x={2};change(x);と渡すとx[0]は9です。配列がコピーされたのではなく、同じ配列を指す参照値をaへコピーしています。a[0]への代入は共有している配列の要素を書き換えるため、呼出し元からも見えます。
参照の再代入 static void replace(int[] a){a=new int[]{9};}にxを渡しても、呼出し元のxが指す配列は変わりません。新しい配列を指すようになるのは仮引数aだけです。配列要素を変更することと、変数が保持する参照を別の配列へ変えることを図で分けます。
評価順序 Javaの引数は左から右へ評価します。int x=1;add(x++,x++)では最初に1を渡してx=2、次に2を渡してx=3となり、戻り値は3です。引数内の増分は読み間違えやすいので、実務のコードでは計算と呼出しを分けることも有効です。
型と個数を合わせる add(int,int)へ引数を一つだけ渡すことはできません。int引数へlongを暗黙に縮小する呼出しも不正です。一方static long twice(long n)へintの3を渡すことは拡大変換により可能です。呼出し可能かを先に判定し、その後に本体の計算を追います。
値渡しを検証する 一つのプログラムに全部の変更を混ぜず、int変数への代入、配列要素への代入、配列参照の再代入を別々に実行します。呼出し前・本体内・呼出し後を表示し、どの変数とどのオブジェクトが変更されたかを照合します。引数の型や個数が不正な例は別ファイルでコンパイル結果を確認します。
図解
重要ポイント
- 実引数の値が仮引数へコピーされる。
- 参照値を渡しても変数自体を共有するわけではない。
- 共有するオブジェクトの内部変更は呼出し元にも見える。
- 実引数は左から右へ評価する。
間違えやすい点
- Javaを参照渡しと説明しない。
- 仮引数への再代入で呼出し元の変数が変わると思わない。
- 引数の型と個数の不一致を実行時エラーと混同しない。
用語解説
- メソッド
- 名前を付けた処理。引数と戻り値を持つことがある。
- 実引数
- 呼出し時に渡す式やその評価結果。
- 仮引数
- メソッド側で値を受け取る変数。
- 値渡し
- 値をコピーして受取側へ渡す仕組み。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
確認問題の出題・採点や学習履歴の保存にはログインが必要です。