関数のオーバーロード

 クラスを定義するときに、同じような処理を複数定義したいという場合があります。例えば、2つのデータを比較して、その結果を返すメソッドを定義するとしましょう。その時に、整数値を比較して整数値を返す処理と、実数値を比較して実数値を返す処理を定義することとなりました。C言語でこのような状況で定義しようとすると2つの名前の関数を用意する必要があります。

例:

 【整数を比較する関数】
  int int_max(int num1, int num2){
  }
 【実数を比較する関数】
  double double_max(double num1, double num2){
  }

 Javaでは、同じ名前の処理を複数定義することができます。これをオーバーロード(overload)と呼びます。ただし、引数の構成を変える必要があります。引数の構成は次の点を考慮に入れて違う構成の引数を定義します。

サンプルダウンロード

○ プログラム

 次のようにCarクラスにメソッドを追加してください。

Car.java

  1. public class Car{
  2.  //フィールド==========
  3.  //public int speed;     //スピード情報
  4.  private int speed;     //スピード情報(修正)
  5.  //public double gas;     //ガソリン情報
  6.  private double gas;     //ガソリン情報(修正)
  7.  //メソッド==========
  8.  //加速させるメソッド
  9.  public void speedUp(int sp){
  1.  //ガソリンを給油するメソッド
  2.  public void setGas(){
  3.   //オーバーロードしているメソッドを呼び出す
  4.   this.setGas(20);
  5.  }
  6.  public void setGas(double gas){
  7.   //止まっている場合は指定したガソリン量を給油
  8.   if(this.speed == 0){
  9.    this.gas += gas;
  10.   }
  11.  }
  12. }

○ クラス図

○ 解説

 50~53行目で給油するメソッドを定義しています。仮引数は指定していません。52行目では55行目から定義しているメソッドを呼び出しています。その際に規定値として20を実引数として指定しています。

 55~60行目では給油するメソッドを定義しています。このメソッドではdouble型の仮引数を一つ指定しています。引数にガソリン量を指定すると、その分ガソリン量を増やします。ただし、ガソリン量を増やすのは車が停止している時です。

○ プログラム

 では、Carオブジェクトを生成して利用しているプログラムも修正しましょう。給油のメニューを追加します。

Run1.java

  1. import java.io.*;
  2. public class Run1{
  3.  //車の状態を表示するメソッド
  4.  public static void showData(Car car){
  5.   //System.out.println("スピード:" + car.speed + "km");
  6.   System.out.println("スピード:" + car.getSpeed() + "km");
  7.   //System.out.println("ガソリン:" + car.gas + "L");
  8.   System.out.println("ガソリン:" + car.getGas() + "L");
  9.  }
  10.  public static void main(String[] args) throws Exception{
  11.   //インスタンスを生成する
  12.   Car car = new Car();
  13.   //フィールド変数を初期化する
  14.   //car.speed = 0;
  15.   //car.gas = 20.0;
  16.   car.init(20.0);
  17.   //現在の状態を表示する
  18.   showData(car);
  19.   //キーボード入力の準備をする
  20.   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  21.   while(true){
  22.    //操作を入力
  23.    System.out.print("1)加速 2)減速 3)給油 9)終了:");
  24.    String inputdata = br.readLine();
  25.    //操作によって分岐する
  26.    switch (inputdata){
  27.     case "1":
  28.      //加速する
  29.      car.speedUp(5);
  30.      showData(car);
  31.      break;
  32.     case "2":
  33.      //減速する
  34.      car.speedDown(5);
  35.      showData(car);
  36.      break;
  37.     case "3":
  38.      //給油する
  39.      car.setGas(35);
  40.      showData(car);
  41.      break;
  42.     case "9":
  43.      //プログラムを終了する
  44.      return;
  45.    }
  46.   }
  47.  }
  48. }

 30行目のメニュー表示に給油のメニューを追加しました。45~49行目ではメニューで給油を選択した時の処理を記述しています。今回は35リッターを指定して給油していますが、引数を指定しない場合は20リッター給油されます。

前へ   次へ