Q
抽象クラスAnimal,具象クラスDog,Cat,Pigを以下のように作成しアプリケーションを作成せよ。
見つける動物の種類はランダムとし、匹数に制限はない。
[クラス]
◯抽象クラス
Animal

フィールド
name

一般メソッド
introduce()

抽象メソッド
makeNoise()

◯具象クラス
Dog extends Animal
makeNoise(){
System.out.println(this.name+”はワンと吠えた”);
}

Cat extends Animal
makeNoise(){
System.out.println(this.name+”はニャーとないた”);

}
sleep(){
System.out.println(this.name+”はすやすや眠った。”);

Pig extends Animal
makeNoise(){
System.out.println(this.name+”はブーとないた”);
}

****AnimalLand****
行動を選択してください。1…見つける 2…様子を見る 3…終わり>2
まだ動物はいません。
行動を選択してください。1…見つける 2…様子を見る 3…終わり>1
犬を見つけた!名前をつけてください>ジョン
こんにちはジョンです。よろしく!
行動を選択してください。1…見つける 2…様子を見る 3…終わり>1
豚を見つけた!名前をつけてください>トン
こんにちはトンです。よろしく!
行動を選択してください。1…見つける 2…様子を見る 3…終わり>2
ジョンはワンと吠えた
トンはブーとないた
行動を選択してください。1…見つける 2…様子を見る 3…終わり>1
猫を見つけた!名前をつけてください>ミケ
こんにちはミケです。よろしく!
行動を選択してください。1…見つける 2…様子を見る 3…終わり>2
ジョンはワンと吠えた
トンはブーとないた
ミケはニャーとないた
ミケはすやすや眠った。
行動を選択してください。1…見つける 2…様子を見る 3…終わり>3
アプリケーションを終了します。

[解答例]
クラス


public abstract class Animal {
	private String name;

	public Animal(String name) {
		super();
		this.name = name;
	}
	public void introduce() {
		System.out.printf("こんにちは%sです。よろしく!%n",this.name);
	}
	public abstract void makeNoise() ;

	public String getName() {
		return name;
	}

}

class Dog extends Animal{

	public Dog(String name) {
		super(name);
	}

	@Override
	public void makeNoise() {
		System.out.printf("%sはワンと吠えた!%n",this.getName());
	}

}
class Cat extends Animal{

	public Cat(String name) {
		super(name);
	}

	@Override
	public void makeNoise() {
		System.out.printf("%sはニャーとないた!%n",this.getName());
	}
	public void sleep() {
		System.out.printf("%sはすやすや眠った。%n",this.getName());
	}

}
class Pig extends Animal{

	public Pig(String name) {
		super(name);
	}

	@Override
	public void makeNoise() {
		System.out.printf("%sはブーとないた!%n",this.getName());
	}

}

アプリケーションクラス

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		Random rand=new Random();
		List<Animal> list=new ArrayList<>();
		String[] types= {"犬","猫","豚"};
		System.out.println("****AnimalLand****");
		while(true) {
			System.out.print("行動を選択してください。1…見つける 2…様子を見る 3…終わり>");
			int select=scan.nextInt();scan.nextLine();
			switch(select) {
			case 1:
				int index=rand.nextInt(types.length);
				System.out.printf("%sを見つけた!名前をつけてください>",types[index]);
				String name=scan.nextLine();
				Animal animal;
				if(index==0) {
					animal=new Dog(name);
				}else if(index==1) {
					animal=new Cat(name);
				}else {
					animal=new Pig(name);
				}
				animal.introduce();
				list.add(animal);
				break;
			case 2:
				if(list.size()==0) {
					System.out.println("まだ動物はいません。");
					break;
				}
				for(Animal a:list) {
					a.makeNoise();
					if(a instanceof Cat) {
						((Cat) a).sleep();
					}
				}
				break;
			case 3:
				scan.close();
				System.out.println("アプリケーションを終了します。");
				return;
			}
		}
	}

}