この問題を解くためには…
 → 応用編第3日目参照

問題3:抽象クラス

probex3-1.(難易度:★)

以下のプログラムは、二種類の飛行機、戦闘機(FighterAiracraft)と、旅客機(PassengerPlane)クラスのインスタンスを生成し、各クラスのメソッドを実行するプログラムである。この2つのクラスには、共通するメンバが存在する。

そこで、これら2つのクラスに共通するメンバを、飛行機(AirPlane)クラスに集約し、FighterAiracraftクラス、およびPassengerPlaneは、それらのクラスを継承したものにするように、プログラムを書きかかえなさい。ただし、この時、AirPlaneクラスは、抽象メソッドfly()を持つ抽象クラスとすること。

probex3-1:FighterAiracraft.java
package problemex3;

//	戦闘機クラス
public class FighterAiracraft{
	//	飛行機のタイプ
	private String type = "戦闘機";
	//  タイプの取得
	public String getType(){
		return type;
	}
	//  飛行する
	public void fly(){
		System.out.println("攻撃に出るために飛行します。");
	}
	//  戦闘する
	public void fight(){
		System.out.println("戦闘します。");
	}
}

PassengerPlane.java
package problemex3;

//	戦闘機クラス
public class PassengerPlane{
	//	飛行機のタイプ
	private String type = "旅客機";
	//  タイプの取得
	public String getType(){
		return type;
	}
	//  飛行する
	public void fly(){
		System.out.println("乗客を乗せて目的地まで飛行します。");
	}
	//  戦闘する
	public void carryPassengers(){
		System.out.println("乗客を目的地まで運びます。");
	}
}
Problemex3_1.java
package problemex3;

public class Problemex3_1 {

	public static void main(String[] args) {
		//  戦闘機クラスのインスタンスの生成
		FighterAiracraft fighter = new FighterAiracraft();
		PassengerPlane airlinear = new PassengerPlane();
		//  戦闘機クラスの処理
		fighter.fly();                  //  飛行する
		fighter.fight();                //  戦闘する
		//  旅客機クラスの処理
		airlinear.fly();                //  飛行する
		airlinear.carryPassengers();    //  乗客を運ぶ

	}

}
実行結果
攻撃に出るために飛行します。
戦闘します。
乗客を乗せて目的地まで飛行します。
乗客を目的地まで運びます。

prob3-2.(難易度:★★)

以下のプログラムは、抽象クラスComputerと、それを実装した、PersonalComputer、TabletPC、およびSmartPhoneクラスを操作するプログラムである。以下に記述されている、Computerクラス、PersonalComputerクラス、Problemex3_2.javaを参考にして、TalbetPCクラス、およびSmartPhoneクラスを完成させ、期待する実行結果と同じものが得られるようにしなさい。

probex3-2:Computer.java
package problemex3;

//	コンピュータの抽象クラス
public abstract class Computer {
	//	コンピュータのタイプ
	private String type;
	//	コンストラクタ
	public Computer(String type){
		this.type = type;
	}
	//	入力処理
	public abstract void input();
	//	出力処理
	public abstract void output();
	//	通信処理
	public void communication(){
		System.out.println("インターネットで通信");
	}
	//	タイプの出力
	public void showType(){
		System.out.println("コンピュータの種類:" + type);
	}
}
PersonalComputer.java
package problemex3;

public class PersonalComputer extends Computer{
	//	コンストラクタ
	public PersonalComputer(){
		super("パーソナルコンピュータ");
	}
	//	入力処理
	public void input(){
		System.out.println("キーボード・マウスで入力");
	}
	//	出力処理
	public void output(){
		System.out.println("ディスプレイに出力");
	}
}
Problemex3_2.java
package problemex3;

public class Problemex3_2 {

	public static void main(String[] args) {
		Computer[] cp = new Computer[3];
		cp[0] = new PersonalComputer();		//	パーソナルコンピュータ
		cp[1] = new TabletPC();				//	タブレットPC
		cp[2] = new SmartPhone();			//
		for(Computer c:cp){
			c.showType();
			c.input();
			c.output();
			c.communication();
			System.out.println("--------------------------------------");
		}

	}

}
期待される実行結果
コンピュータの種類:パーソナルコンピュータ
キーボード・マウスで入力
ディスプレイに出力
インターネットで通信
--------------------------------------
コンピュータの種類:タブレットPC
タッチパネルディスプレイをタップして操作
タッチパネルディスプレイに出力
インターネットで通信
--------------------------------------
コンピュータの種類:スマートフォン
タッチパネルディスプレイをタップして操作
タッチパネルディスプレイに出力
インターネットと電話回線で通信
--------------------------------------