メソッドの引数
メソッドには、もっと柔軟で便利な使い方が有ります。 呼び出し元から情報(値)を受け取り、それに応じて処理を行うことができるのです。
引数を持つメソッド
メソッドが呼び出されるときに、呼び出し元から値を受け取ることができます。 そのために使われるのが引数です。
メソッド宣言には引数リストという部分が有りました。 ここに、引数を記述するのです。
構文 : メソッド宣言(再掲)
static 戻り値の型 メソッド名(引数リスト){ 文1 文2 ... return 式; }
実際に、引数を持つメソッドを見てみましょう。 これは、指定された回数だけメッセージを表示するメソッドです。
static void printMessage(String msg, int n){
for(int i = 0; i < n; i++){
System.out.println(msg);
}
}
戻り値の型 | メソッド名 | 引数リスト |
---|---|---|
void | printMessage | String msg, int n |
引数は引数リストの中に0個以上の何個でも記述することができ、2個以上の場合は、カンマ(,)で区切って記述します。 引数の型は基本型、参照型のいずれも指定することができます。 printMessageメソッドの引数は、String型のmsgとint型のnとなっています。 例えば、「ゲームのやり過ぎに注意!」と4回表示させる場合、呼び出し元から"ゲームのやり過ぎに注意!"という文字列と回数を表す4が渡されて、それぞれmsgとnに格納されることになります。
"ゲームのやり過ぎに注意!"という文字列は、Stringクラスのインスタンスです。 ですから、厳密に言えば、msgに格納されるのは、"ゲームのやり過ぎに注意!"という文字列への参照になります。 しかし、このことについては、今は気にする必要はありません。
メソッド本体では、受け取った引数に応じて、処理を行うことができます。 printMessageメソッドでは、for文の条件「i < n」でnが利用されています。 nの値が4なら、msgの内容が4回表示されることになります。
- メソッドは、引数を使って呼び出し元から値を受け取ることができる。
- メソッド本体では、受け取った値に応じた処理をすることができる。
引数を持つメソッドを呼び出す
printMessageメソッドを呼び出して、「ゲームのやり過ぎに注意!」と4回表示させる場合、次のように記述します。
printMessage("ゲームのやり過ぎに注意!", 4);
メソッド宣言での引数のことを特に仮引数(formal parameter)と呼び、メソッド呼び出しでの引数は実引数(actual argument)と呼びます。 ここでは、実引数として"ゲームのやり過ぎに注意!"と4を渡して呼び出しています。 1番目の仮引数は1番目の実引数で、2番目の仮引数は2番目の実引数で初期化されます。 従って、msgは"ゲームのやり過ぎに注意!"で、nは4で初期化されることになります。

実引数の型・個数・並び順は、仮引数のそれと一致していなければなりません。 従って、以下のような呼び出し方はすべてコンパイルエラーとなります。
printMessage("ゲームのやり過ぎに注意!", 4.0); //引数の型が違う printMessage("ゲームのやり過ぎに注意!"); //引数の個数が違う printMessage(4, "ゲームのやり過ぎに注意!"); //引数の並び順が違う
実引数の型・個数・並び順は、仮引数のそれと一致していなければならない。
値を受け取ったメソッドは、仮引数の値に応じて、処理を行うことができます。 そして、reuturn文が実行されるかメソッドの処理が最後まで到達すると、処理は呼び出し元に戻ります。 printMessageメソッドでは、msgが表す文字列がn回表示された後、メソッドの最後に到達して、呼び出し元に戻ります。
引数を持つメソッドを使ってみる
printMessageメソッドを試してみましょう。 このプログラムは「ゲームのやり過ぎに注意!」を4回、「宿題は終わったかな。」を6回表示します。
MethodSample02.java
class MethodSample02 { static void printMessage(String msg, int n){ for(int i = 0; i < n; i++){ System.out.println(msg); } } public static void main(String[] args) { printMessage("ゲームのやり過ぎに注意!", 4); printMessage("宿題は終わったかな。", 6); } }
MethodSample02の実行結果
ゲームのやり過ぎに注意! ゲームのやり過ぎに注意! ゲームのやり過ぎに注意! ゲームのやり過ぎに注意! 宿題は終わったかな。 宿題は終わったかな。 宿題は終わったかな。 宿題は終わったかな。 宿題は終わったかな。 宿題は終わったかな。
mainメソッドで、 printMessage("ゲームのやり過ぎに注意!", 4); が実行されると、printMessageメソッドの中でfor文が実行され、「ゲームのやり過ぎに注意!」が4回表示されます。 今回はreturn文が有りませんが、メソッドの最後に到達してmainメソッドに戻ります。 この後は、 printMessage("宿題は終わったかな。", 6); が実行されます。

いろいろな実引数
実引数には、リテラルだけでなく、変数や式を指定することもできます。 実引数のいくつかの例を見ておきましょう。
MethodSample03.java
class MethodSample03 { static void decideSign(double a){ if(a > 0){ System.out.println(a + " は正の数です。"); }else if(a < 0 ){ System.out.println(a + " は負の数です。"); }else{ System.out.println(a + " は0です。"); } } public static void main(String[] args) { decideSign(0.1); //浮動小数点数リテラルを渡す decideSign(8); //整数リテラルを渡す。(型変換) double v = -2.4; decideSign(v); //変数を渡す。 decideSign(v+5); //式を渡す。 } }
MethodSample03の実行結果
0.1 は正の数です。 8.0 は正の数です。 -2.4 は負の数です。 2.6 は正の数です。
decideSignメソッドは、与えられた数が正の数・負の数・0のいずれであるかを判定して、結果を表示するメソッドです。
戻り値の型 | メソッド名 | 引数リスト |
---|---|---|
void | decideSign | double a |
mainメソッド内でのdecideSignの呼び出し方を見ていきましょう。
decideSign(0.1); //浮動小数点数リテラルを渡す
浮動小数点数リテラルの0.1を渡しています。 これは、ごく当たり前の呼び出し方ですね。
decideSign(8); //整数リテラルを渡す。(型変換)
整数リテラルの実引数はint型と見なされます。 decideSignの仮引数はdouble型ですが、int型の実引数を指定することができます。 この場合、int型の8は自動的にdouble型の8.0に型変換されてから、仮引数のaに代入されます。 これは、大きなサイズの型の変数に、小さなサイズの型の値を代入することができたのと同じことです。
double v = -2.4; decideSign(v); //変数を渡す。
実引数には変数を指定することもできます。 この場合、仮引数aには実引数vの値の-2.4が代入されます。 このように、仮引数と実引数の変数名は同じでなくてもかまいません。
decideSign(v+5); //式を渡す。
さらに、実引数には式を指定することもできます。 この場合、5がdouble型に型変換されて、v+5.0が計算され、その結果の2.6が仮引数aに代入されることになります。
実引数には、変数や式を指定することができる。