Java第4章 総合練習問題【後半】

記事上広告

この総合演習問題では第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フィールドの値を戻り値で返す
getStatus(10)の場合、-1を戻り値で返す

【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は以下のように記述してください。

ヒント
あくまでも参考のヒントです。

BattleCharacter.javaのsetStatus()メソッドおよびgetStatus()メソッドのヒント(プログラムは一部のみ抜粋)

Hero.javaのヒント(プログラムは一部のみ抜粋)

実行結果

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を以下のように修正し、再度コンパイルおよび実行してみましょう。

【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を流用すると記述が楽になります)

実行結果

C:\work\exam>javac Exam1016.java

C:\work\exam>java Exam1016
名前:ななし ひろ
職業:勇者
レベル:3
HP:14
MP:10
攻撃:19
魔法威力:10
防御:10
魔法防御:9

コンパイルおよび実行後、Exam1016.javaを以下のように修正し、再度コンパイルおよび実行してみましょう。

スポンサーリンク
レクタングル