この総合演習問題では第4章の総まとめ復習問題となります。
問題はどんどん難しくなっていきます。
前半はメソッドやオーバーロード、コンストラクタ等の問題。
後半では前半の内容にプラスして、継承やオーバーライド、インタフェースと実装等の問題となっています。(インタフェース練習問題は作成途中)
継承とオーバーライド
examフォルダ内にファイルやフォルダは保存してください。(階層→c:\work\exam)
ここからの問題は第4章までの様々な記述を利用してプログラムを作成していきます。
極力、APIなどのすでに作られたプログラムは利用せずに、この練習問題は一部を除き基本構文のみで作成してください。
【Java】総合練習問題 継承
以下の「プログラム内容」「実行結果」を確認して、プログラムを完成させてください。examフォルダ内に「Exam1015.java」「BattleCharacter.java」「Hero.java」「Warrior.java」で保存してください。
なお、HeroクラスおよびWarriorクラスはBattleCharacterクラスを継承して作成してください。
保存後、「Exam1015.java」をコンパイルおよび実行を行ってください。
【BattleCharacterクラス プログラム内容】
指示1 BattleCharacterクラスのメンバ指示
クラス名 | ||||
---|---|---|---|---|
BattleCharacter | ||||
アクセス修飾子 | フィールド名 | 型 | 初期値 | |
private | name | String | なし(宣言のみ) | |
private | level | int | なし(宣言のみ) | |
private | hp | int | なし(宣言のみ) | |
private | mp | int | なし(宣言のみ) | |
private | attack | int | なし(宣言のみ) | |
private | m_attack | int | なし(宣言のみ) | |
private | defense | int | なし(宣言のみ) | |
private | m_defense | int | なし(宣言のみ) | |
private | type | String | なし(宣言のみ) | |
アクセス修飾子 | 引数 | コンストラクタの処理内容 | ||
なし | String name, int level, int hp, int mp, int attack, int m_attack, int defense, int m_defense, String type | 引数の値を各フィールドに設定するコンストラクタ | ||
アクセス修飾子 | メソッド名 | 戻り値の型 | 引数 | 処理内容 |
なし | setName | void | String n | 引数の値をフィールドnameに設定する |
なし | getName | String | なし | フィールドnameの値を戻り値で返す |
なし | setType | void | String n | 引数の値をフィールドtypeに設定する |
なし | getType | String | なし | フィールドtypeの値を戻り値で返す |
なし | setStatus | void | int n, int s | 第一引数の値に応じて、第二引数の値を対応するフィールドに設定する※ |
なし | getStatus | int | int n | 引数で指定された値に応じて、対応するフィールドの値を返す※ |
※ 詳細は指示2を参照
指示2 setStatus()およびgetStatus()について
setStatus()の第一引数およびgetStatus()の第一引数に指定される数値とフィールドは以下のように対応します。
0=level、1=hp、2=mp、3=attack、4=m_attack、5=defense、6=m_defense
上記の対応を参考にし、setStatus()内とgetStatus()内の処理は以下の記述を行います。
setStatus() | 第一引数の値で条件分岐を行い、対応するフィールドに第二引数の値を設定する。
例:setStatus(3, 5)の場合、attackフィールドに5が設定される |
---|---|
getStatus() | 第一引数の値で条件分岐を行い、対応するフィールドの値を戻り値として返す。もし対応するフィールドの数値でない場合は-1を返す。
例:getStatus(5)の場合、defenseフィールドの値を戻り値で返す |
【Heroクラス プログラム内容】
指示1 Heroクラスのメンバ指示
クラス名 | ||||
---|---|---|---|---|
Hero(BattleCharacterのサブクラス) | ||||
アクセス修飾子 | 引数 | コンストラクタの処理内容 | ||
なし | String name, int level, int hp, int mp, int attack,int m_attack, int defense, int m_defense |
処理については指示2を参照 | ||
なし | なし | 処理については指示3を参照 | ||
アクセス修飾子 | メソッド名 | 戻り値の型 | 引数 | 処理内容 |
なし | levelUp | void | なし | 処理については指示4を参照 |
指示2 引数ありのコンストラクタ
引数で取得した値をスーパークラスのコンストラクタに引き渡す。具体的には以下のような記述を行うが、xxxの部分は変数を指定すること。
super(xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, “勇者”);
指示3 引数なしのコンストラクタ
値をスーパークラスのコンストラクタに引き渡す。具体的には以下のような記述を行うが、xxxの部分は以下を参考に指定すること。
super(xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx);
name=”ななし ひろ”、 level=1、hp=10、mp=8、attack=10、m_attack=8、defense=8、m_defense=7、type=”勇者”
指示4 levelUp()メソッド
スーパークラスのフィールドの値を以下のように増加させるメソッド。
levelは+1、hpは+2、mpは+1、attackは+2、m_attackは+1、defenseは+1、m_defenseは+1
【Warriorクラス プログラム内容】
指示1 Worriorクラスのメンバ指示
クラス名 | ||||
---|---|---|---|---|
Warrior(BattleCharacterのサブクラス) | ||||
アクセス修飾子 | 引数 | コンストラクタの処理内容 | ||
なし | String name, int level, int hp, int mp, int attack,int m_attack, int defense, int m_defense |
処理については指示2を参照 | ||
なし | なし | 処理については指示3を参照 | ||
アクセス修飾子 | メソッド名 | 戻り値の型 | 引数 | 処理内容 |
なし | levelUp | void | なし | 処理については指示4を参照 |
指示2 引数ありのコンストラクタ
引数で取得した値をスーパークラスのコンストラクタに引き渡す。具体的には以下のような記述を行うが、xxxの部分は変数を指定すること。
super(xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, “戦士”);
指示3 引数なしのコンストラクタ
値をスーパークラスのコンストラクタに引き渡す。具体的には以下のような記述を行うが、xxxの部分は以下を参考に指定すること。
super(xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx);
name=”せん つよし”、 level=1、hp=15、mp=0、attack=12、m_attack=0、defense=10、m_defense=5、type=”戦士”
指示4 levelUp()メソッド
スーパークラスのフィールドの値を以下のように増加させるメソッド。
levelは+1、hpは+3、mpは+0、attackは+3、m_attackは+0、defenseは+2、m_defenseは+1
【Exam1015クラス プログラム内容】
Exam1015.javaは以下のように記述してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
class Exam1015{ public static void main(String[] args){ Hero hero = new Hero(); Warrior warrior01 = new Warrior(); //Warrior warrior01 = new Warrior("たろう",3,20,0,18,0,10,2); hero.levelUp(); hero.levelUp(); System.out.println("名前:" + hero.getName()); System.out.println("職業:" + hero.getType()); System.out.println("レベル:" + hero.getStatus(0)); System.out.println("HP:" + hero.getStatus(1)); System.out.println("MP:" + hero.getStatus(2)); System.out.println("攻撃:" + hero.getStatus(3)); System.out.println("魔法威力:" + hero.getStatus(4)); System.out.println("防御:" + hero.getStatus(5)); System.out.println("魔法防御:" + hero.getStatus(6)); System.out.println(); warrior01.levelUp(); System.out.println("名前:" + warrior01.getName()); System.out.println("職業:" + warrior01.getType()); System.out.println("レベル:" + warrior01.getStatus(0)); System.out.println("HP:" + warrior01.getStatus(1)); System.out.println("MP:" + warrior01.getStatus(2)); System.out.println("攻撃:" + warrior01.getStatus(3)); System.out.println("魔法威力:" + warrior01.getStatus(4)); System.out.println("防御:" + warrior01.getStatus(5)); System.out.println("魔法防御:" + warrior01.getStatus(6)); } } |
BattleCharacter.javaのsetStatus()メソッドおよびgetStatus()メソッドのヒント(プログラムは一部のみ抜粋)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
class BattleCharacter{ void setStatus(int n, int s){ switch(xxx){ case 0: this.level = xxx; break; case 1: this.hp = xxx; break; case 2: this.mp = xxx; break; case 3: this.attack = xxx; break; case 4: this.m_attack = xxx; break; case 5: this.defense = xxx; break; case 6: this.m_defense = xxx; break; } } int getStatus(int n){ int number = -1; switch(xxx){ case 0: number = this.xxx; break; case 1: number = this.xxx; break; case 2: number = this.xxx; break; case 3: number = this.xxx; break; case 4: number = this.xxx; break; case 5: number = this.xxx; break; case 6: number = this.xxx; break; } return number; } } |
Hero.javaのヒント(プログラムは一部のみ抜粋)
1 2 3 4 5 6 7 8 |
public void levelUp(){ //levelの値を1増加させる int level = getStatus(0) + 1; setStatus(0,level); //同様に、hp,mp,attack,m_attack,defense,m_defenseも増加させる } |
実行結果
C:\work\exam>javac Exam1015.java
C:\work\exam>java Exam1015
名前:ななし ひろ
職業:勇者
レベル:3
HP:14
MP:10
攻撃:14
魔法威力:10
防御:10
魔法防御:9
名前:せん つよし
職業:戦士
レベル:2
HP:18
MP:0
攻撃:15
魔法威力:0
防御:12
魔法防御:6
コンパイルおよび実行後、Exam1015.javaを以下のように修正し、再度コンパイルおよび実行してみましょう。
1 2 |
//Warrior warrior01 = new Warrior(); //コメントを付加 Warrior warrior01 = new Warrior("たろう",3,20,0,18,0,10,2); //コメントを外す |
【Java】総合練習問題 インタフェースと実装
以下の「プログラム内容」「実行結果」を確認して、プログラムを完成させてください。examフォルダ内に「Exam1016.java」「BattleCharacter2.java」「Hero2.java」「Equippable.java」「Weapon.java」で保存してください。
なお、BattleCharacter2クラスはEquippableを実装して作成してください。
保存後、「Exam1016.java」をコンパイルおよび実行を行ってください。
【Equippableインタフェース プログラム内容】
指示1 Equippableインタフェースのメンバ指示
インタフェース名 | ||||
---|---|---|---|---|
Equippable | ||||
アクセス修飾子 | メソッド名 | 戻り値の型 | 引数 | 処理内容 |
なし | weaponEquip | void | Weapon w | 武器を装備する抽象メソッド |
なし | weaponRemove | void | なし | 武器を外す抽象メソッド |
【Weaponクラス プログラム内容】
指示1 Weaponクラスのメンバ指示
クラス名 | ||||
---|---|---|---|---|
Weapon | ||||
アクセス修飾子 | フィールド名 | 型 | 初期値 | |
private | name | String | なし(宣言のみ) | |
private | power | int | なし(宣言のみ) | |
アクセス修飾子 | 引数 | コンストラクタの処理内容 | ||
なし | String name, int power | 引数の値を各フィールドに設定するコンストラクタ | ||
アクセス修飾子 | メソッド名 | 戻り値の型 | 引数 | 処理内容 |
なし | getPower | int | なし | フィールドpowerの値を戻り値で返す |
【BattleCharacter2クラス プログラム内容】
指示1 BattleCharacter2クラスはBattleCharacterクラスをコピーして作成してください
指示2 Equippableインターフェースを実装してください
指示3 コンストラクタについて
コンストラクタ名は修正しておくこと。なお、引数や内部処理は変更はしません。
指示4 BattleCharacter2クラスは以下のメンバを追加してください(BattleCharacterからコピーしたメンバの修正はなし)。
クラス名 | ||||
---|---|---|---|---|
BattleCharacter2 | ||||
アクセス修飾子 | フィールド名 | 型 | 初期値 | |
private | weapon | Weapon | なし(宣言のみ) | |
アクセス修飾子 | メソッド名 | 戻り値の型 | 引数 | 処理内容 |
public | weaponEquip | void | Weapon w | 武器を装備する処理を記述する
詳細は指示5を参照 |
public | weaponRemove | String | なし | 武器の装備を外す処理を記述する
詳細は指示6を参照 |
指示5 weaponEquip()メソッドについて
引数で取得したWeaponインスタンスをフィールドに格納します。
また、WeaponインスタンスのgetPower()メソッドを利用して、attackフィールドに攻撃力をプラスします。
指示6 weaponRemove()メソッドについて
WeaponインスタンスのgetPower()メソッドを利用して、attackフィールドから攻撃力をマイナスする。
また、フィールドweaponのインスタンスはnullを代入することで、装備解除とします。
【Hero2クラス プログラム内容】
指示1 Hero2クラスはHeroクラスをコピーして作成してください
指示2 コンストラクタについて
コンストラクタ名は修正しておくこと。なお、引数や内部処理は変更はしません。
【Exam1016クラス プログラム内容】
Exam1016.javaは以下のように記述してください。(Exam1015.javaを流用すると記述が楽になります)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Exam1016{ public static void main(String[] args){ Hero2 hero = new Hero2(); Weapon sword = new Weapon("剣",5); hero.weaponEquip(sword); hero.levelUp(); hero.levelUp(); System.out.println("名前:" + hero.getName()); System.out.println("職業:" + hero.getType()); System.out.println("レベル:" + hero.getStatus(0)); System.out.println("HP:" + hero.getStatus(1)); System.out.println("MP:" + hero.getStatus(2)); System.out.println("攻撃:" + hero.getStatus(3)); System.out.println("魔法威力:" + hero.getStatus(4)); System.out.println("防御:" + hero.getStatus(5)); System.out.println("魔法防御:" + hero.getStatus(6)); } } |
実行結果
C:\work\exam>javac Exam1016.java
C:\work\exam>java Exam1016
名前:ななし ひろ
職業:勇者
レベル:3
HP:14
MP:10
攻撃:19
魔法威力:10
防御:10
魔法防御:9
コンパイルおよび実行後、Exam1016.javaを以下のように修正し、再度コンパイルおよび実行してみましょう。
1 2 |
//Weapon sword = new Weapon("剣",5); //コメントを付加 //hero.weaponEquip(sword); //コメントを付加 |