Developer

【はじめてのJava】メソッドのオーバーライド(実践)【クラスの継承編】
2021.12.31
Lv1

【はじめてのJava】メソッドのオーバーライド(実践)【クラスの継承編】

はじめてのJava

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


クラスの継承編

クラスの継承編では、Javaを扱う上で重要な「クラスの継承」について扱っていきます。

前回はメソッドのオーバーライドについて扱いました。

今回は実際に「accell()メソッド」をオーバーライドします。


目次


継承されたメソッドの上書き

以前、Carクラスと、Carクラスを継承したPoliceCarクラスを作成しました。

PoliceCarクラスはCarクラスを基にして作成されているため、accell()の動作はCarクラスと同じです。

今回はPoliceCarクラスのaccell()メソッドをオーバーライドし、犯人追跡中の加速を10ではなく20にします。

 


オーバーライド(実践)

では、実際にオーバーライドを実践していきましょう。

以前作成したCarクラス、PoliceCarクラスは以下の通りです。

Car.java

class Car {
  double speed;
  String color;
  void accell(){
    this.speed += 10; //speedを10増加させる
  }
}

PoliceCar.java

class PoliceCar extends Car{
  boolean isChasing; //追跡中ならtrue、それ以外はfalse
  void questioning(){ //とりあえず、Freeze!!(動くな!!)と表示
    System.out.println("Freeze!!");
  }
}

PoliceCarクラスに以下ように追記します。

PoliceCar.java

class PoliceCar extends Car{
  boolean isChasing; //追跡中ならtrue、それ以外はfalse
  void questioning(){ //とりあえず、Freeze!!(動くな!!)と表示
    System.out.println("Freeze!!");
  }
  //ここから追記
  //オーバーライド
  void accell(){
    if(this.isChasing){ //isChasingがtrueのとき
      this.speed += 20; //speedを20増やす
    }else{ //isChasingがfalseのとき
      this.speed += 10; //speedを10増加させる
    }
  }
  //ここまで
}

これでオーバーライド完了です。
※ちょっとした問題点があるため、上記をそのまま利用するのはお勧めしません。詳しくは次回紹介します。

 


動作確認

では、動作確認してみましょう。

動作確認のために、PoliceDriveクラスを以下のようにします。(いつも通り、3つのクラスとも同じディレクトリに配置してください。)

PoliceDrive.java

public class PoliceDrive{
  public static void main(String[] args){
    PoliceCar panda = new PoliceCar();
    panda.speed = 0.0;
    System.out.println(panda.speed);
    panda.isChasing = false; //追跡していない状態
    panda.accell(); //accellを踏むとspeedが10増加
    System.out.println(panda.speed); //↑の確認用に表示

    System.out.println("############"); //このままだと分かりづらいので表示時の境界線を出力

    panda.speed = 0.0; //一度pandaのspeedをリセット
    System.out.println(panda.speed);
    panda.isChasing = true; //追跡状態
    panda.accell(); //accellを踏むとspeedが20増加
    System.out.println(panda.speed); //↑の確認用に表示

  }
}

実行結果は以下の通りです。

 


サンプルプログラム

今回作成したサンプルプログラムは以下の通りです。なお、3つのファイルは同じディレクトリに保存して動作を確認してください。

Car.javaには手を加えていませんが、PoliceDriveクラスを実行するためにはCarクラスも必要になります。よくわからない場合は必ず同じディレクトリにCar.javaも保存しておいてください。

Car.java

class Car {
  double speed;
  String color;
  void accell(){
    this.speed += 10; //speedを10増加させる
  }
}

PoliceCar.java

class PoliceCar extends Car{
  boolean isChasing; //追跡中ならtrue、それ以外はfalse
  void questioning(){ //とりあえず、Freeze!!(動くな!!)と表示
    System.out.println("Freeze!!");
  }
  //ここから追記
  //オーバーライド
  void accell(){
    if(this.isChasing){ //isChasingがtrueのとき
      this.speed += 20; //speedを20増やす
    }else{ //isChasingがfalseのとき
      this.speed += 10; //speedを10増加させる
    }
  }
  //ここまで
}

PoliceDrive.java

public class PoliceDrive{
  public static void main(String[] args){
    PoliceCar panda = new PoliceCar();
    panda.speed = 0.0;
    System.out.println(panda.speed);
    panda.isChasing = false; //追跡していない状態
    panda.accell(); //accellを踏むとspeedが10増加
    System.out.println(panda.speed); //↑の確認用に表示

    System.out.println("############"); //このままだと分かりづらいので表示時の境界線を出力

    panda.speed = 0.0; //一度pandaのspeedをリセット
    System.out.println(panda.speed);
    panda.isChasing = true; //追跡状態
    panda.accell(); //accellを踏むとspeedが20増加
    System.out.println(panda.speed); //↑の確認用に表示

  }
}

次回

次回はオーバーライドの注意点について考えていきます。


はじめてのJavaシリーズの目次はこちら
クラスの継承編はこちら


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