[ Java練習問題 ] 練習問題 第14回 『抽象クラス、抽象メソッド』

目次

抽象クラス 、抽象メソッド

Java練習問題 第14回では「抽象クラス」についての問題を用意してあります。
「抽象クラス」の解説はこちら

問題 1 難易度 ★★★

動物園シミュレーションゲームの作成です。
下記のコードでは、Elephant クラスと Tiger クラスが定義済みですが、eat()メソッド以外は記述が重複しています。

① Animal クラスを以下のように定義してください。
  Animal クラスは、虎や象、その他の動物クラスのスーパークラスとなるものです。
  ただし、Animal は実体化しない抽象概念なので、抽象クラスとしてください。
  また、Animal は何かを食べますが、何を食べるかは確定できないので、抽象メソッド eat()を定義   してください。

② Elephant クラスと Tiger クラスの重複部分を削除し、Animal を継承したクラスに修正してください。
eat()の実装は、それぞれ「象は草を食べた」「虎は肉を食べた」を出力、としてください。

③ main メソッド内で、Elephant と Tiger をインスタンス化し、それぞれの eat()を呼び出してください。

public class Main_1001 {
  public static void main(String[] args) {
    // 3の解答をここに記述してください。
  }
}

  // 1の解答をここに記述してください。

// 2の設問に沿って Elephant クラスを変更してください。
class Elephant {
  private int age;
  private String name;
  private double weight;
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public double getWeight() {
    return weight;
  }
  public void setWeight(double weight) {
    this.weight = weight;
  }
  public void eat() {
    System.out.println("象は草を食べた");
  }
}

// 2の設問に沿って Tiger クラスを変更してください。
class Tiger {
  private int age;
  private String name;
  private double weight;
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public double getWeight() {
    return weight;
  }
  public void setWeight(double weight) {
    this.weight = weight;
  }
  
  public void eat() {
    System.out.println("虎は肉を食べた");
  }
}

実行例

象は草を食べた
虎は肉を食べた

問題 1 解答

正解は、、、
public class Main_1001 {
  public static void main(String[] args) {
    Elephant elephant = new Elephant();
    elephant.eat();
    
    Tiger tiger = new Tiger();
    tiger.eat();
  }
}

//抽象クラス Animal
abstract class Animal {
  private int age;
  private String name;
  public double weight;
  public int getAge() {
    return age;
  }
  
  public void setAge(int age) {
    this.age = age;
  }
  
  public String getName() {
    return name;
  }
  
  public void setName(String name) {
    this.name = name;
  }
  
  public double getWeight() {
    return weight;
  }
  
  public void setWeight(double weight) {
    this.weight = weight;
  }
  abstract void eat();
}

// スーパークラス Animal が、上記のように定義されていれば、動物の種類を増やす場合にも、
// 以下のようにシンプルな記述で済ますことができます。

//Animal の子クラスとしての Elephant クラス
class Elephant extends Animal {
  @Override
  public void eat() {
    System.out.println("象は草を食べた");
  }
}

//Animal の子クラスとしての Tiger クラス
class Tiger extends Animal {
  @Override
  public void eat() {
    System.out.println("虎は肉を食べた");
  }
}

問題 2 難易度 ★★★★

車のシミュレーションプログラムの作成です。
下記のコードでは、GasolineCar(ガソリン車)クラスと、ElectricCar(電気自動車)クラスが定義済みですが、accelPedal メソッド以外は記述が重複しています。

問 1

① AbstractCar(抽象概念としての車)クラスを以下のように定義してください。
AbstractCar クラスは、GasolineCar や ElectricCar、その他の車クラスのスーパークラスとなるものです。
ただし、AbstractCar は実体化しない抽象概念なので、抽象クラスとしてください。
また、AbstractCar は、accelPedal によって走行しますが、どのような機構によって速度を上げるのかは確定できないので、accelPedal メソッドは抽象メソッドとして定義してください。

問 2

① GasolineCar クラスと ElectricCar クラスの重複部分を削除し、AbstractCar を継承したクラスに修正してください。

② accelPedal メソッドの実装は、それぞれ
「****号車はガソリン流量を増やし、エンジン回転数を上げた」
「****号車は電圧を上げ、モーター回転数を上げた」をコンソール出力するようにしてください。

問 3

① main メソッド内で、AbstractCar 型の配列を要素数 2 つで初期化してください。
② 0番目の要素には、ガソリン車「ナンバー:4649 車体色:white」、
  1番目の要素には、電気自動車「ナンバー:5963 車体色:black」を格納してください。
③ 繰り返し文を用いて、
  ・ 各車の accelPedal メソッドを引数 20.0 で呼び出し、
  ・ 各車の showStatus メソッドを呼び出し、
  ・ 各車の breakPedal メソッドを呼び出し、
  ・ 各車の showStatus メソッドを呼び出し、
  を、行ってください。

public class Main_1002 {
  public static void main(String[] args) {
  
  }
}

class GasolineCar {
  private int number; // 車のナンバー
  private String color; // 車体の色
  private double speed; // 現在の速度
  
  public GasolineCar(int number, String color) {
    this.number = number;
    this.color = color;
  }
  void accelPedal(double power) {
    System.out.println(getNumber() +
    "号車はガソリン流量を増やし、エンジン回転数を上げた");
    setSpeed(power);
  }
  public void breakPedal() {
    System.out.println(getNumber() +"号車は制動装置を使って、停止した");
    setSpeed(0.0d);
  }
  public void showStatus() {
    System.out.println(number +"号車 車体色:"+ color +" 現在速度:"+ speed +"km/h");
  }
  public int getNumber() {
    return number;
  }
  public void setNumber(int number) {
    this.number = number;
  }
  public String getColor() {
    return color;
  }
  public void setColor(String color) {
    this.color = color;
  }
  public double getSpeed() {
    return speed;
  }
  public void setSpeed(double speed) {
    this.speed = speed;
  }
}

class ElectricCar {
  private int number; // 車のナンバー
  private String color; // 車体の色
  private double speed; // 現在の速度
  public ElectricCar(int number, String color) {
    this.number = number;
    this.color = color;
  }
  void accelPedal(double power) {
    System.out.println(getNumber() + "号車は電圧を上げ、モーター回転数を上げた");
    setSpeed(power);
  }
  public void breakPedal() {
    System.out.println(getNumber() + "号車は制動装置を使って、停止した");
    setSpeed(0.0d);
  }
  public void showStatus() {
    System.out.println(number +"号車 車体色:"+ color +" 現在速度:" + speed +"km/h");
  }
  public int getNumber() {
    return number;
  }
  public void setNumber(int number) {
    this.number = number;
  }
  public String getColor() {
    return color;
  }
  public void setColor(String color) {
    this.color = color;
  }
  public double getSpeed() {
    return speed;
  }
  public void setSpeed(double speed) {
    this.speed = speed;
  }
}

実行例

4649 号車はガソリン流量を増やし、エンジン回転数を上げた
4649 号車 車体色:white 現在速度:20.0km/h
4649 号車は制動装置を使って、停止した
4649 号車 車体色:white 現在速度:0.0km/h
5963 号車は電圧を上げ、モーター回転数を上げた
5963 号車 車体色:black 現在速度:20.0km/h
5963 号車は制動装置を使って、停止した
5963 号車 車体色:black 現在速度:0.0km/h

問題 2 解答

正解は、、、
public class Main_1002 {
  public static void main(String[] args) {
  AbstractCar[] cars = new AbstractCar[2];
  cars[0] = new GasolineCar(4649, "white");
  cars[1] = new ElectricCar(5963, "black");
  for (int i = 0; i < cars.length; i++) {
    cars[i].accelPedal(20.0);
    cars[i].showStatus();
    cars[i].breakPedal();
    cars[i].showStatus();
  }
}

//抽象クラス AbstractCar
abstract class AbstractCar {
  private int number; //車のナンバー
  private String color; //車体の色
  private double speed; //現在の速度
  public AbstractCar(int number, String color) {
    this.number = number;
    this.color = color;
  }
  
  abstract void accelPedal(double power);
  public void breakPedal() {
    System.out.println(getNumber() + "号車は制動装置を使って、停止した");
    setSpeed(0.0d);
  }
  
  public void showStatus() {
    System.out.println(
    number + "号車 車体色:" + color + " 現在速度:" + speed + "km/h");
  }
  
  public int getNumber() {
    return number;
  }
  
  public void setNumber(int number) {
    this.number = number;
  }
  
  public String getColor() {
    return color;
  }
  
  public void setColor(String color) {
    this.color = color;
  }
  
  public double getSpeed() {
    return speed;
  }
  
  public void setSpeed(double speed) {
    this.speed = speed;
  }
}

// スーパークラス AbstractCar が、上記のように定義されていれば、車の種類を増やす場合にも、
// 以下のようにシンプルな記述で済ますことができます。

// AbstractCar の子クラスとしての GasolineCar
class GasolineCar extends AbstractCar {
  public GasolineCar(int number, String color) {
    super(number, color);
  }
  @Override
  void accelPedal(double power) {
    System.out.println(getNumber()+"号車はガソリン流量を増やし、エンジン回転数を上げた");
    setSpeed(power);
  }
}

//AbstractCar の子クラスとしての ElectricCar
class ElectricCar extends AbstractCar {
  public ElectricCar(int number, String color) {
    super(number, color);
  }
  @Override
  void accelPedal(double power) {
    System.out.println(getNumber() + "号車は電圧を上げ、モーター回転数を上げた");
    setSpeed(power);
  }
}

Java練習問題 第15回では「インターフェース」から出題します。

(Visited 146 times, 1 visits today)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次