Developer

【はじめてのJava】メソッドのオーバーロード【オブジェクトとクラス編】
2021.06.24
Lv1

【はじめてのJava】メソッドのオーバーロード【オブジェクトとクラス編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


オブジェクトとクラス編

オブジェクトとクラス編では、Javaを扱う上で非常によく出てくる「オブジェクト」や「クラス」について扱っていきます。

前回は「引数や戻り値があるメソッドの使い方」について扱いました。

今回は「メソッドのオーバーロード」について扱います。


目次


オーバーロード

 オーバーロード とは同一のクラスの中に同名のメソッドを複数定義することです。

具体的に見ていきましょう。


オーバーロードとは

オーバーロードとは同一のクラスの中に同名のメソッドを複数定義することです。メソッドを呼び出す際に、 メソッド名が同じでも引数の違いから呼び出しているメソッドを特定できる ことを利用しています。

どういうことなのか、見ていきましょう。

例えば、以前作成したCarクラスにはaccellという名前のメソッドがあります。このaccellメソッドは、引数無しで、実行するとCarのspeedが10増加するメソッドです。

では、もしspeedを20増加したい場合はどうすればよいでしょうか。

一つの方法としては「accellを2回実行する」という方法が考えられます。これでも問題ありません。

一方で、「1度のaccellの実行でspeedを20増加させたい」ということもあり得ます。

このような場合には、例えばオーバーロードを利用してaccell(20)と実行すればspeedが20増加するようなspeedメソッドをCarクラスに追加します。

どちらもメソッド名は「accell」ですが、引数の違いからどちらのメソッドを呼び出しているのか区別することが可能です。

accell() → 引数がないaccellメソッドを呼び出している

accell(20) → int型の引数を取るaccellメソッドを呼び出している


オーバーロードの方法

では、実際にCarクラスのaccellメソッドをオーバーロードしてみましょう。

今回はCarクラスのaccellメソッドをオーバーロードします。

もとのCarクラスは以下の通りです。

class Car{
  double speed;
  String color;

  void accell(){
    speed += 10;
  }
}

accellメソッドをオーバーロードし、引数に数字を渡した場合はその数字分だけspeedが増加するようにします。


オーバーロードの書き方

では、accellメソッドをオーバーロードします。

メソッドをオーバーロードする際は「既存の同名メソッドとは引数の違いから区別可能なメソッド」として作成します。

以下は、accellメソッドをオーバーロードし、int型の引数を1つ取るaccellメソッドを追加したCarクラスです。

※長くならないように、オーバーロードしたaccellメソッドはメソッドの戻り値、メソッド名、引数のみ記載しています。

class Car{
  double speed;
  String color;

  void accell(){
    speed += 10;
  }

  //↓オーバーロードしたaccellメソッド
  void accell(int s){
    //ここに処理内容を書く
  }

}

具体的な処理を足すとaccellメソッドのオーバーロードが完成します。

今回は下記のようにしました。sの値が負の数だった場合、speedを変更する前にreturnしてspeedの値が変わらないようにしています。

class Car{
  double speed;
  String color;

  void accell(){
    speed += 10;
  }

  //↓オーバーロードしたaccellメソッド
  void accell(int s){
    if(s < 0){
      //sが負の数だった場合、メソッドの処理を終了する
      return;
    }
    speed +=s;
  }

}

これでaccell(20)と実行するとspeedが20増加するaccellメソッドが追加されました。


オーバーロードしたメソッドの使い方

オーバーロードしたメソッドは、メソッドの呼び出し時に引数を変えることで呼び分けをします。

例えば、今回オーバーロードしたaccellメソッドは以下のように呼び分けることができます。

public class MyCarDrive{
  public static void main(String[] args){
    Car myCar = new Car();
    myCar.speed = 0.0;
    System.out.println(myCar.speed);
 
    myCar.accell(); //引数無しのaccellメソッドを呼び出してspeedを10増加させる
    System.out.println(myCar.speed); //myCarのspeedが10増加している

    myCar.accell(20); //int型の引数を取るaccellメソッドを呼び出してspeedを20増加させる
    System.out.println(myCar.speed); //myCarのspeedが20増加している

  }
}

ソースコード

今回使用したソースコードをまとめて記載します。2つのソースコードは同じディレクトリに配置する必要があります。

Car.java

class Car{
  double speed;
  String color;

  void accell(){
    speed += 10;
  }

  //↓オーバーロードしたaccellメソッド
  void accell(int s){
    if(s < 0){
      //sが負の数だった場合、メソッドの処理を終了する
      return;
    }
    speed +=s;
  }

}

MyCarDrive.java

public class MyCarDrive{
  public static void main(String[] args){
    Car myCar = new Car();
    myCar.speed = 0.0;
    System.out.println(myCar.speed);
 
    myCar.accell(); //引数無しのaccellメソッドを呼び出してspeedを10増加させる
    System.out.println(myCar.speed); //myCarのspeedが10増加している

    myCar.accell(20); //int型の引数を取るaccellメソッドを呼び出してspeedを20増加させる
    System.out.println(myCar.speed); //myCarのspeedが20増加している

  }
}

まとめ

同名で引数が異なるメソッドを定義することをメソッドをオーバーロードするという。
オーバーロードされたメソッドは引数の違いからどのメソッドを呼び出しているのか判別が可能。

次回

次回はオーバーロードの注意点について扱います。


はじめてのJavaシリーズの目次はこちら
オブジェクトとクラス編はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら