メソッドのオーバーロード
クラスを定義するときに、同じような処理を複数定義したいという場合があります。例えば、2つのデータを比較して、その結果を返すメソッドを定義するとしましょう。その時に、整数値を比較して整数値を返す処理と、実数値を比較して実数値を返す処理を定義することとなりました。C言語でこのような状況で定義しようとすると2つの名前の関数を用意する必要があります。
例:
【整数を比較する関数】
int int_max(int num1, int num2){
}
【実数を比較する関数】
double double_max(double num1, double num2){
}
Javaでは、同じ名前の処理を複数定義することができます。これをオーバーロード(overload)と呼びます。ただし、引数の構成を変える必要があります。引数の構成は次の点を考慮に入れて違う構成の引数を定義します。
- 引数のデータ型
- 引数の数
- 引数の順番
○ プログラム
次のようにCarクラスにメソッドを追加してください。
Car.java
- public class Car{
- //フィールド
- //public int speed; //スピード情報
- private int speed; //スピード情報(修正)
- //public double gas; //ガソリン情報
- private double gas; //ガソリン情報(修正)
- //メソッド
- //加速させるメソッド
- public void speedUp(int sp){
- //ガソリンを給油するメソッド
- public void setGas(){
- //オーバーロードしているメソッドを呼び出す
- this.setGas(20);
- }
- public void setGas(double gas){
- //止まっている場合は指定したガソリン量を給油
- if(this.speed == 0){
- this.gas += gas;
- }
- }
- }
○ クラス図
○ 解説
50~53行目で、給油するメソッドを定義しています。仮引数は指定していません。52行目では、55行目から定義しているメソッドを呼び出しています。その際に規定値として20を実引数として指定しています。
55~60行目では、もう一つ給油するメソッドを定義しています。このメソッドではdouble型の仮引数を一つ指定しています。引数にガソリン量を指定すると、その分ガソリン量を増やします。ただし、ガソリン量を増やすのは車が停止している時です。
○ プログラム
では、Carオブジェクトを生成して利用しているプログラムも修正しましょう。給油のメニューを追加します。
CarTest.java
- public static void main(String[] args) throws Exception{
- //インスタンスを生成する
- Car car = new Car();
- //フィールド変数を初期化する
- //car.speed = 0;
- //car.gas = 20.0;
- car.init(20.0);
- //現在の状態を表示する
- showData(car);
- //キーボード入力の準備をする
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- while(true){
- //操作を入力
- System.out.print("1)加速 2)減速 3)給油 9)終了:");
- String inputdata = br.readLine();
- //操作によって分岐する
- switch (inputdata){
- case "1":
- //加速する
- car.speedUp(5);
- showData(car);
- break;
- case "2":
- //減速する
- car.speedDown(5);
- showData(car);
- break;
- case "3":
- //給油する
- car.setGas(35);
- showData(car);
- break;
- case "9":
- //プログラムを終了する
- return;
- }
- }
- }
○ 解説
30行目のメニュー表示に給油のメニューを追加しました。45~49行目では、メニューで給油を選択した時の処理を記述しています。今回は引数に35リッターを指定して給油していますが、引数に応じてCarクラスのオーバーロードされたメソッドから適切な引数の構成のものが選択されて、呼び出されます。
47行目で、引数を指定しない場合は、内部的に引数を受け取るsetGasメソッドに引数20を渡してよびだすので、結果として20リッター給油されます。
このように、オーバーロードの機能を使うと、同じ処理名で異なる動きの処理を定義できるので、メソッド管理の手間を増やさないですみます。異なる動きをする処理の仮引数を変えて用意しておくだけで、利用者から受け取った引数を元に、自動的にメソッドを選択し、実行してくれます。