メソッドを定義する
メソッドを定義する- [modifier] rtype name(type args,…) {
- statements
- }
- modifier:修飾子
- rtype:戻り値の型
- name:メソッド名
- type:引数の型
- args:引数
- statements:メソッドの本体
メソッドは、クラスにおける動作、処理(手続き)を表す要素です。
たとえば以下は、Animalクラスの文字列表現を返すgetInfoメソッドの例です。
Animal.java
package com.example.mynavi.object; public class Animal { String name = "ポチ"; String color = "White"; public String getInfo(String format) { return String.format(format, this.name, this.color); } }
このAnimalクラスをインスタンス化し、getInfoメソッドにアクセスするには、以下のようにします。
ClassMethod.java
package com.example.mynavi.object; public class ClassMethod { public static void main(String[] args) { Animal a = new Animal(); a.name = "トクジロウ"; a.color = "ネズミ"; System.out.println(a.getInfo("%sは%s色のハムスターです。")); } // 結果:トクジロウはネズミ色のハムスターです。 }
メソッドに対して呼び出し元から渡せるパラメーター情報のことを引数と言います。引数は「データ型 仮引数名」の形式で指定します。仮引数は、メソッドの中でのみ参照できる変数です。getInfoメソッドであれば、String型の引数formatをひとつだけ指定していますが、カンマ区切りで複数の引数を指定することもできます。
public String getInfo(String format, boolean flag) { ... }
また、型名のうしろに「…」を付与することで、可変長引数を表すこともできます。可変長引数とは、呼び出し側で自由に引数の数を変えられる引数のことです。たとえば以下は、引数の総和を求めるsumメソッドの例です。
Util.java
package com.example.mynavi.object; public class Util { public static double sum(double... values) { double result = 0; for (double value : values) { result += value; } return result; } }
sumメソッドは、以下のように呼び出せます(static修飾子については、「修飾子」節を参照してください)。
ClassVariable.java
package com.example.mynavi.object; public class ClassVariable { public static void main(String[] args) { System.out.println(Util.sum(10, 30, 50)); // 結果:90.0 System.out.println(Util.sum(10, 30, 50, 70)); // 結果:160.0 } }
可変長引数は、内部的には配列として処理されます。サンプルでは引数valuesを拡張for命令で順に取り出し、順に足しこんでいるわけです。
戻り値メソッドの処理結果を表すのが、戻り値の役割です。「return 戻り値」の形式で戻り値を呼び出し元に返せます。メソッドの実行は、return命令によって終了しますので、その後方の処理を書いても無視される点に注意してください。
特に、呼び出し元に結果を返す必要がない場合には、return命令は省略することもできます。その場合には、戻り値の型には戻り値がないことを意味するvoidを指定してください。
public void show(String format) { ... }
thisキーワードは、現在のインスタンスを指します。たとえば、getInfoメソッドであれば、以下の部分です。this.name、this.colorという記述によって、現在のインスタンスにおけるname、colorフィールドの値を参照しています。
public String getInfo(String format) { return String.format(format, this.name, this.color); }
Javaでは、「同じ名前で、引数の型、並びだけが異なる」メソッドを複数定義することもできます。これをメソッドのオーバーロードと言います。 例えば以下は、先ほども登場したAnimal#getInfoメソッドの、引数なしバージョンを定義した例です。
Animal.java
class Animal { String name = "ポチ"; String color = "White"; public String getInfo() { return this.getInfo("%sは%s色のハムスターです。"); } public String getInfo(String format) { return String.format(format, this.name, this.color); } }
確かに、引数を省略したgetInfoメソッドが正しく呼び出せていることも確認してください。
ClassMethod2.java
package com.example.mynavi.object; public class ClassMethod2 { public static void main(String[] args) { Animal a = new Animal(); a.name = "トクジロウ"; a.color = "ネズミ"; System.out.println(a.getInfo()); } // 結果:トクジロウはネズミ色のハムスターです。 }
オーバーロードを利用することで、このように、いわゆる省略可能なパラメーターも定義できるというわけです。