注目記事

【Javaコード入門】オブジェクト指向構文_⑤メソッドを定義する

メソッドを定義する

[modifier] rtype name(type args,…) {
statements
}
 modifier:修飾子
 rtype:戻り値の型
 name:メソッド名
 type:引数の型
 args:引数
 statements:メソッドの本体

メソッドは、クラスにおける動作、処理(手続き)を表す要素です。
たとえば以下は、Animalクラスの文字列表現を返すgetInfoメソッドの例です。

Animal.java

  1. package com.example.mynavi.object;
  2.  
  3. public class Animal {
  4. String name = "ポチ";
  5. String color = "White";
  6.  
  7. public String getInfo(String format) {
  8. return String.format(format, this.name, this.color);
  9. }
  10. }

このAnimalクラスをインスタンス化し、getInfoメソッドにアクセスするには、以下のようにします。

ClassMethod.java

  1. package com.example.mynavi.object;
  2.  
  3. public class ClassMethod {
  4.  
  5. public static void main(String[​] args) {
  6. var a = new Animal();
  7. a.name = "トクジロウ";
  8. a.color = "ネズミ";
  9. System.out.println(a.getInfo("%sは%s色のハムスターです。"));
  10. } // 結果:トクジロウはネズミ色のハムスターです。
  11. }

引数

メソッドに対して呼び出し元から渡せるパラメーター情報のことを引数と言います。引数は「データ型 仮引数名」の形式で指定します。仮引数は、メソッドの中でのみ参照できる変数です。getInfoメソッドであれば、String型の引数formatをひとつだけ指定していますが、カンマ区切りで複数の引数を指定することもできます。

  1. public String getInfo(String format, boolean flag) { ... }

また、型名のうしろに「…」を付与することで、可変長引数を表すこともできます。可変長引数とは、呼び出し側で自由に引数の数を変えられる引数のことです。たとえば以下は、引数の総和を求めるsumメソッドの例です。

Util.java

  1. package com.example.mynavi.object;
  2.  
  3. public class Util {
  4. public static double sum(double... values) {
  5. double result = 0;
  6. for (double value : values) {
  7. result += value;
  8. }
  9. return result;
  10. }
  11. }

sumメソッドは、以下のように呼び出せます(static修飾子については、「修飾子」節を参照してください)。

ClassVariable.java

  1. package com.example.mynavi.object;
  2.  
  3. public class ClassVariable {
  4. public static void main(String[​] args) {
  5. System.out.println(Util.sum(10, 30, 50)); // 結果:90.0
  6. System.out.println(Util.sum(10, 30, 50, 70)); // 結果:160.0
  7. }
  8. }

可変長引数は、内部的には配列として処理されます。サンプルでは引数valuesを拡張for命令で順に取り出し、順に足しこんでいるわけです。

戻り値

メソッドの処理結果を表すのが、戻り値の役割です。「return 戻り値」の形式で戻り値を呼び出し元に返せます。メソッドの実行は、return命令によって終了しますので、その後方の処理を書いても無視される点に注意してください。
特に、呼び出し元に結果を返す必要がない場合には、return命令は省略することもできます。その場合には、戻り値の型には戻り値がないことを意味するvoidを指定してください。

  1. public void show(String format) { ... }

現在のインスタンスを参照する – thisキーワード

thisキーワードは、現在のインスタンスを指します。たとえば、getInfoメソッドであれば、以下の部分です。this.name、this.colorという記述によって、現在のインスタンスにおけるname、colorフィールドの値を参照しています。

  1. public String getInfo(String format) {
  2. return String.format(format, this.name, this.color);
  3. }

メソッドのオーバーロード

Javaでは、「同じ名前で、引数の型、並びだけが異なる」メソッドを複数定義することもできます。これをメソッドのオーバーロードと言います。 例えば以下は、先ほども登場したAnimal#getInfoメソッドの、引数なしバージョンを定義した例です。

Animal.java

  1. class Animal {
  2. String name = "ポチ";
  3. String color = "White";
  4.  
  5. public String getInfo() {
  6. return this.getInfo("%sは%s色のハムスターです。");
  7. }
  8.  
  9. public String getInfo(String format) {
  10. return String.format(format, this.name, this.color);
  11. }
  12. }

確かに、引数を省略したgetInfoメソッドが正しく呼び出せていることも確認してください。

ClassMethod2.java

  1. package com.example.mynavi.object;
  2.  
  3. public class ClassMethod2 {
  4. public static void main(String[​] args) {
  5. var a = new Animal();
  6. a.name = "トクジロウ";
  7. a.color = "ネズミ";
  8. System.out.println(a.getInfo());
  9. } // 結果:トクジロウはネズミ色のハムスターです。
  10. }

オーバーロードを利用することで、このように、いわゆる省略可能なパラメーターも定義できるというわけです。

オブジェクト指向構文_目次
class命令
new演算子
フィールドを定義する
static final修飾子
メソッドを定義する
コンストラクターを定義する
レコード
package宣言
import命令
import static命令
ネストしたクラスを定義する
モジュール

監修

山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。