抽象クラス 、抽象メソッド
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 メソッド以外は記述が重複しています。
STEP 1
AbstractCar(抽象概念としての車)クラスを以下のように定義してください。
① AbstractCar クラスは、GasolineCar や ElectricCar、その他の車クラスのスーパークラスです。
② AbstractCar は実体化しない抽象概念なので、抽象クラスとしてください。
③ AbstractCar は、accelPedal によって走行しますが、どのような機構によって速度を上げるのかは確定できないので、accelPedal メソッドは抽象メソッドとして定義してください。
STEP 2
① GasolineCar クラスと ElectricCar クラスの重複部分を削除し、AbstractCar を継承したクラスに修正してください。
② accelPedal メソッドの実装は、それぞれ
 「****号車はガソリン流量を増やし、エンジン回転数を上げた」
 「****号車は電圧を上げ、モーター回転数を上げた」をコンソール出力してください。
STEP 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回では「インターフェース」から出題します。






 
  
 






