抽象クラス 、抽象メソッド
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回では「インターフェース」から出題します。
コメント