オブジェクト指向基本問題。staticの扱い。

Q1
1.以下のように箱を表すクラスBoxを定義する。
■一般クラス:Box

<フィールド>
private String color 箱の色
private String shape 箱の形
private int num 箱の中のボールの数
private static int totalNumber すべての箱のボールの総数
<コンストラクタ>
public Box(String color,String shape,int num){
処理
}
<メソッド>
insertBalls
… 引数として渡された個数のボールを箱に入れる
removeBalls
… 引数として渡された個数のボールを箱から取り出す
  個数が不足する場合はすべてのボールを取り出す
displayInfo
… 箱の色・形、ボールの数を表示する
static displayTotalNumber
… すべての箱のボールの総数を表示する

2.BoxAppクラスを作成し、「赤、円形、1」「青、四角、2」でBoxクラスのインスタンスを2つnewして以下の処理を実現せよ。

[実行例]

1. ボール投入 / 2. ボール取出 / 3. ボール総数表示 / 4. 終了>1
0---色:赤, 形:円形, 個数:1
1---色:青, 形:四角, 個数:2
ボールを投入する箱の番号を入力して下さい > 1
投入するボールの個数を入力して下さい > 2
2個のボールを入れました。

1. ボール投入 / 2. ボール取出 / 3. ボール総数表示 / 4. 終了>3
ボールの合計は5個です。

1. ボール投入 / 2. ボール取出 / 3. ボール総数表示 / 4. 終了>2
0---色:赤, 形:円形, 個数:1
1---色:青, 形:四角, 個数:4
ボールを取り出す箱の番号を入力して下さい > 0
取り出すボールの個数を入力して下さい > 2
1個のボールを取り出しました。

1. ボール投入 / 2. ボール取出 / 3. ボール総数表示 / 4. 終了>1
0---色:赤, 形:円形, 個数:0
1---色:青, 形:四角, 個数:4
ボールを投入する箱の番号を入力して下さい > 2
箱の番号の入力が誤っています。

1. ボール投入 / 2. ボール取出 / 3. ボール総数表示 / 4. 終了>4
アプリケーションを終了します。

Boxクラス

public class Box {
	private String color;
	private String shape;
	private int num;
	private static int totalNumber;
	
	public Box(String color,String shape,int num){
		this.color=color;
		this.shape=shape;
		this.num=num;
		totalNumber+=num;
	}
	
	public void insertBalls(int num){
		this.num+=num;
		totalNumber+=num;
		System.out.printf("%d個のボールを入れました。%n",num);
		
	}
	public void removeBalls(int num){
		int n=this.num > num ? num:this.num;
		this.num-=n;
		totalNumber-=n;
		System.out.printf("%d個のボールを取り出しました。%n",n);
	}
	public void displayInfo(){
		System.out.printf("色:%s, 形:%s, 個数:%d%n", this.color,this.shape,this.num);
	}
	public static void displayTotalNumber(){
		System.out.printf("ボールの合計は%d個です。%n",Box.totalNumber);
	}
}

アプリケーションクラス
●配列を使わない

import java.util.Scanner;
public class BoxApp {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		Box box1 = new Box("赤", "円形", 1);
		Box box2 = new Box("青", "四角", 2);
		while (true) {
			System.out.print("1. ボール投入 / 2. ボール取出 / 3. ボール総数表示 / 4. 終了>");
			int select = scan.nextInt();
			if (select ==1 || select==2) {
				System.out.print("0---");
				box1.displayInfo();
				System.out.print("1---");
				box2.displayInfo();
			}
			switch (select) {
			case 1:
				System.out.print("ボールを投入する箱の番号を入力してください>");
				int boxNumber = scan.nextInt();
				if(!(boxNumber == 0 || boxNumber==1)){
					System.out.println("箱の番号の入力が誤っています。");				
				}else{
					System.out.print("投入するボールの個数を入力してください>");
					int ballNum = scan.nextInt();
					if (boxNumber == 0) {
						box1.insertBalls(ballNum);
					} else {
						box2.insertBalls(ballNum);
					} 	
				}	
				break;
			case 2:
				System.out.print("ボールを取り出す箱の番号を入力してください>");
				boxNumber = scan.nextInt();
				if(!(boxNumber == 0 || boxNumber==1)){
					System.out.println("箱の番号の入力が誤っています。");				
				}else{
					System.out.print("取り出すボールの個数を入力してください>");
					int ballNum = scan.nextInt();
					if (boxNumber == 0) {
						box1.removeBalls(ballNum);
					} else {
						box2.removeBalls(ballNum);
					} 	
				}	
				break;
			case 3:
				Box.displayTotalNumber();
				break;
			default:
				System.out.println("アプリケーションを終了します。");
				scan.close();
				return;
			}
		}
	}
}

●配列を使う

import java.util.Scanner;
public class BoxApp2 {
	private static Box[] boxes = { new Box("赤", "円形", 1), new Box("青", "四角", 2) };
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		while (true) {
			System.out.print("1. ボール投入 / 2. ボール取出 / 3. ボール総数表示 / 4. 終了>");
			int select = scan.nextInt();
			switch (select) {
			case 1:
				displayInfo();
				System.out.print("ボールを投入する箱の番号を入力して下さい >");
				int index = scan.nextInt();
				if (index < 0 || index >= boxes.length) {
					System.out.println("箱の番号の入力が誤っています。");
					continue;
				}
				System.out.print("投入するボールの個数を入力して下さい >");
				int num = scan.nextInt();
				boxes[index].insertBalls(num);
				break;
			case 2:
				displayInfo();
				System.out.print("ボールを取り出す箱の番号を入力して下さい >");
				index = scan.nextInt();
				if (index < 0 || index >= boxes.length) {
					System.out.println("箱の番号の入力が誤っています。");
					continue;
				}
				System.out.print("取り出すボールの個数を入力して下さい >");
				num = scan.nextInt();
				boxes[index].removeBalls(num);
				break;
			case 3:
				Box.displayTotalNumber();
				break;
			case 4:
				System.out.println("アプリケーションを終了します。");
				scan.close();
				return;
			}
		}
	}

	public static void displayInfo() {
		for (int i = 0; i < boxes.length; i++) {
			System.out.print(i + "---");
			boxes[i].displayInfo();
		}
	}

}