パラメータはメソッドに入力を受け取らせる
いつも同じことしかしないメソッドは融通が利きません。パラメータは、同じメソッドが呼び出されるたびに異なる値を処理できるように、メソッドの括弧の中で宣言する入力です。
各パラメータには型と名前を付けて並べます。メソッド本体の中では、パラメータは呼び出し側が渡した値をすでに保持している普通のローカル変数のように振る舞います。
name がパラメータです。"Sam" と "Alex" が引数で、呼び出し時に与えられる具体的な値です。メソッドの定義は1つでも、出力は2つ異なります。
パラメータと引数
この2つの言葉はゆるく使われがちですが、区別をはっきりさせておく価値があります。
- パラメータは宣言の中のプレースホルダーです:
String name。 - 引数は実際に渡す値です:
"Sam"。
つまり void greet(String name) はパラメータを宣言し、greet("Sam") は引数を渡します。誰かが「このメソッドは2つのパラメータを取る」と言うときは宣言のことを指し、「2つの引数を渡した」と言うときは呼び出しのことを指します。
複数のパラメータ
パラメータはカンマで区切り、それぞれに固有の型を付けます。変数宣言のように2つのパラメータで型を共有することはできません。
引数はパラメータに名前ではなく厳密に位置で対応づけられます。describe("Sam", 30, true) が機能するのは、順序が (String name, int age, boolean active) と一致しているからです。互換性のある型の引数を2つ入れ替えると、コンパイルエラーではなく、見えにくいロジックのバグになります。だから順序が重要です。
よくある間違いは int add(int a, b) と書くことです。各パラメータにはそれぞれの型が必要です:int add(int a, int b)。
値を返す
パラメータはデータが入っていく手段であり、戻り値は結果が出ていく手段です。メソッド名の前に戻り値の型を宣言し、return を使って呼び出し側に値を返します。
戻り値の型(double)は、実際に return する値と一致していなければなりません。void と宣言されたメソッドは何も返しません。早く抜けるために値のない return; を使うことはできますが、値を返すことはできません。return が実行された瞬間にメソッドは終了し、制御は呼び出し元へ戻ります。
Javaは値渡し
これは最初ほとんどの人がつまずくところです。引数を渡すと、Javaは値をパラメータにコピーします。プリミティブ型ではメソッドが自分専用のコピーを得るということなので、パラメータを変更しても呼び出し側の変数には決して触れません。
x は 5 のままです。メソッドは元の数ではなく、自分のコピーを変更しただけです。
オブジェクトを渡す:それでも値渡し、ただし参照に注意
オブジェクトは例外のように感じられますが、そうではありません。コピーされるのは参照(オブジェクトを指す矢印)であって、オブジェクトそのものではありません。そのためメソッドは同じオブジェクトを指し、それを変更できます。
結果は2つ異なりますが、ルールは1つです。addItem は参照をたどって実際のリストを変更するので、呼び出し側には new が現れて見えます。replace はパラメータをまったく新しいリストに再代入しますが、それは参照のローカルコピーの向きを変えるだけなので、呼び出し側の list はそのままです。要点は、パラメータを通してオブジェクトを変更することはできても、呼び出し側の変数を新しい場所に向けさせることは決してできない、ということです。
次へ:メソッドのオーバーロード
これで、メソッドに必要な入力をちょうど与える方法がわかりました。では、1つのメソッド名で異なるパラメータの組み合わせを受け取りたい場合はどうでしょう。たとえば print(int) と print(String) のように。それがメソッドのオーバーロードであり、次のページのテーマです。
よくある質問
Javaにおけるパラメータと引数の違いは何ですか?
パラメータはメソッド宣言で名前が付けられた変数で、void greet(String name) の String name のことです。引数はメソッドを呼び出すときに実際に渡す値で、greet("Sam") は引数 "Sam" を渡します。簡単に言うと、パラメータは定義の中に、引数は呼び出しの中に存在します。
Javaは値渡しですか、それとも参照渡しですか?
Javaは常に値渡しです。プリミティブ型では値のコピーが渡されるため、パラメータを再代入しても呼び出し側の変数を変えることはできません。オブジェクトでは参照のコピーが渡されます。参照が指すオブジェクトを変更すること(たとえばリストへの追加)はできますが、パラメータ自体を再代入しても呼び出し側の変数には影響しません。
Javaでメソッドに複数の引数を渡すにはどうすればよいですか?
宣言の中でパラメータをカンマで区切って並べ、それぞれに型を付けます:int add(int a, int b)。同じ順序で引数を渡して呼び出します:add(2, 3)。Javaは引数をパラメータに名前ではなく厳密に位置で対応づけるため、順序が一致している必要があります。