オブジェクト指向、抽象クラスの問題。

Q1
以下のようなクラスを作成し、処理を実現する。

■クラス:OfficeWorker(抽象クラス)

<フィールド>
・名前

<コンストラクタ>
・任意

<メソッド>
public void introduece(){自己紹介をする}
public abstract void work();//抽象メソッド
public String getName(){名前のゲッター}

■クラス:OrdinaryOfficeWorker(スーパークラス:OfficeWorker)

<メソッド>(抽象メソッドの実装)
public void work(){普通のオフィスワーカーの働きぶりを書く}
■クラス:EliteOfficeWorker(スーパークラス:OfficeWorker)

<メソッド>(抽象メソッドの実装)
public void work(){エリートオフィスワーカーの働きぶりを書く}
■クラス:LazyOfficeWorker(スーパークラス:OfficeWorker)

<メソッド>(抽象メソッドの実装)
public void work(){怠惰なオフィスワーカーの働きぶりを書く}

■アプリケーションクラス
3人のオフィスワーカーインスタンスを作成し、処理を実現する。この際、3人の実クラスは3つのクラスからランダムに選ぶこと。

[実行例]

あなたの部下に3人配属されました
1人目の名前を入力してください>John
はじめまして。私はJohnです。
2人目の名前を入力してください>Paul
はじめまして。私はPaulです。
3人目の名前を入力してください>George
はじめまして。私はGeorgeです。
誰の働きぶりを見にいきますか?
0・・・John
1・・・Paul
2・・・George
3・・・終了
番号を入力してください>0
Johnは仕事がはやい!しかも正確だ。
誰の働きぶりを見にいきますか?
0・・・John
1・・・Paul
2・・・George
3・・・終了
番号を入力してください>1
Paulは9時から5時まで働いている。遅刻や欠勤はない
誰の働きぶりを見にいきますか?
0・・・John
1・・・Paul
2・・・George
3・・・終了
番号を入力してください>2
GeorgeはPCの画面を即座に切り替えた。何をしていたのだろう。
誰の働きぶりを見にいきますか?
0・・・John
1・・・Paul
2・・・George
3・・・終了
番号を入力してください>3
アプリケーションを終了します。

一般クラス

public abstract class OfficeWorker {
	private String name;
	protected OfficeWorker(String name){
		this.name=name;
	}
	public void introduece(){
		System.out.println("はじめまして。私は" +this.name + "です。");
	}
	public abstract void work();
	public String getName(){
		return this.name;
	}
}
class OrdinaryOfficeWorker extends OfficeWorker{
	protected OrdinaryOfficeWorker(String name) {
		super(name);
	}
	@Override
	public void work() {
		System.out.println(this.getName()+"は9時から5時まで働いている。遅刻や欠勤はない");
	}	
}
class EliteOfficeWorker extends OfficeWorker{
	protected EliteOfficeWorker(String name) {
		super(name);
	}
	@Override
	public void work() {
		System.out.println(this.getName()+"は仕事がはやい!しかも正確だ。");	
	}
}
class LazyOfficeWorker extends OfficeWorker{
	protected LazyOfficeWorker(String name) {
		super(name);
	}
	@Override
	public void work() {
		System.out.println(this.getName()+"はPCの画面を即座に切り替えた。何をしていたのだろう。");
	}	
}

アプリケーションクラス

import java.util.Random;
import java.util.Scanner;
public class OfficeWorkerApp {
	public static void main(String[] args) {
		System.out.println("あなたの部下に3人配属されました");
		OfficeWorker[] bms=new OfficeWorker[3];
		Random r=new Random();
		Scanner s=new Scanner(System.in);
		for(int i=0;i<bms.length;i++){
			System.out.print(i+1+"人目の名前を入力してください>");
			String name=s.nextLine();
			int type=r.nextInt(3);
			switch(type){
			case 0:
				bms[i]=new OrdinaryOfficeWorker(name);
				break;
			case 1:
				bms[i]=new EliteOfficeWorker(name);
				break;
			case 2:
				bms[i]=new LazyOfficeWorker(name);
				break;	
			}
			bms[i].introduece();
		}
		while(true){
			System.out.println("誰の働きぶりを見にいきますか?");
			for(int i=0;i<=bms.length;i++){
				System.out.printf("%d・・・%s%n",i,i==bms.length?"終了":bms[i].getName());
			}
			System.out.print("番号を入力してください>");
			int select=s.nextInt();
			if(select == bms.length){
				System.out.println("アプリケーションを終了します。");
				s.close();
				return;
			}else{
				bms[select].work();
			}
		
		}
	}
}