こんにちは。ECF Tech
ブログ担当 Michiharu.Tです。
Javaプログラミング向け練習問題、オブジェクト指向プログラミング編。今回はオブジェクト指向プログラミングの要ともいえる継承です。
継承の内容がイメージしやすいシンプルな内容をメインに出題してみました。ぜひ、チャレンジしてみてください。
一般的なJavaの学習順序に沿ったテーマの一覧(※随時追加)は、こちらのリンクよりご確認頂けます。
Javaのトピックスです。主に初心者向けにプログラミング学習ネタを提供していきます。
解説動画
2023/03/24 解説動画を掲載しました。
問題編
Q001
問題
下の仕様に基づいて、各クラスを作成してください。
(仕様)
従業員を表すEmployeeクラスを作成します。次のメンバ変数、メソッドを作成し、Employee.javaとして保存します。
- メンバ変数を作成する
- 名前を表すnameをString型で宣言します。
- operationメソッドを作成します。
- 引数:なし
- 戻り値:なし
- 処理内容:「xxxは通常業務を行ないます。」と表示します。
※ xxxはメンバ変数nameを示しています。
従業員の管理者を表すManagerクラスを、Employeeクラスを継承して作成します。次のメソッドを作成し、Manager.javaとして保存します。
- managementメソッドを作成する
- 引数:なし
- 戻り値:なし
- 処理内容:「xxxは管理業務を行ないます。」と表示します。
※ xxxはメンバ変数nameを示しています。
提供コード
下のMain.javaをコメントの指示(①~③)に基づいて追記します。その後、作成した他のソースファイルと同じフォルダ内に保存して動作確認し、実行結果が得られることを確認してください。
(Main.java)
public class Main { public static void main(String[] args) { Employee taro = new Employee(); taro.name = "タロウ"; Manager hanako = new Manager(); hanako.name = "ハナコ"; //①taroの持つoperationメソッドを呼び出します。 //②hanakoの持つoperationメソッドを呼び出します。 //③hanakoの持つmanagementメソッドを呼び出します。 } }
実行結果
タロウは通常業務を行ないます。 ハナコは通常業務を行ないます。 ハナコは管理業務を行ないます。
(解答はこちら)
Q002
問題
下の仕様に基づいて、各クラスを作成してください。
(仕様)
RPGに登場する戦士を表すFighterクラスを作成します。
次のメンバ変数、コンストラクタを作成し、Fighter.javaとして保存します。
- メンバ変数を作成する
- 職業名を表すnameをString型で宣言する
- 攻撃力を表すatkをint型で宣言する
- コンストラクタを作成する
- 引数:なし
- 処理内容:
- メンバ変数nameに、「戦士」を代入する
- メンバ変数atkに、10を代入する
- attackメソッドを作成する
- 引数:なし
- 戻り値:なし
- 処理内容:
- 「xxxの攻撃!」と表示する。※xxxはメンバ変数nameの値
- 「敵にyyyのダメージ!」と表示する。※yyyはメンバ変数atkの値
RPGに登場する魔法戦士を表すMagicFighterクラスを、Fighterクラスを継承して作成します。次のメンバ変数、コンストラクタ、メソッドを追加し、MagicFighter.javaとして保存します。
- メンバ変数を作成する
- 魔力を表すmpをint型で宣言する
- コンストラクタを作成する
- 引数:なし
- 処理内容:
- メンバ変数nameに、「魔法戦士」を代入する
- メンバ変数mpに、10を代入する
- attackメソッドをオーバーライドする
- 処理内容:
- 「xxxの魔法攻撃!」と表示する。xxxはメンバ変数name
- 「敵にyyのダメージ!」と表示する。yyはメンバ変数atkとmpの合計値
- 処理内容:
提供コード
下記のMain.javaを作成した他のソースファイルと同じフォルダ内に保存して動作確認し、実行結果が得られることを確認してください。
public class Main { public static void main(String[] args) { Fighter fighter = new Fighter(); fighter.attack(); MagicFighter magicFighter = new MagicFighter(); magicFighter.attack(); } }
実行結果
戦士の攻撃! 敵に10のダメージ! 魔法戦士の魔法攻撃! 敵に30のダメージ!
(解答はこちら)
Q003
問題
下の仕様に基づいて、各クラスを作成してください。
(仕様)
時計を表すClockクラスを作成します。
次のメンバ変数、コンストラクタ、メソッドを作成し、Clock.javaとして保存します。
- メンバ変数を作成する
- 時間を表すtimeをString型で宣言する
- コンストラクタを作成する
- 引数:
- time:String型
- 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
- 引数:
- showTimeメソッドを作成する
- 引数:なし
- 戻り値:なし
- 処理内容:「xxxxです。」と表示する。xxxxは、メンバ変数timeの値
アラームつき時計を表すAlarmClockクラスを、Clockクラスを継承して作成します。
次のメンバ変数、コンストラクタ、メソッドを追加し、AlarmClock.javaとして保存します。
- メンバ変数を作成する
- アラーム設定時間を表すalarmTimeをString型で宣言する
- コンストラクタを作成する
- 引数: time:String型
- 処理内容:引数で与えられた値を使って、親クラスのコンストラクタを呼び出す
- alarmメソッドを作成する
- 引数:なし
- 戻り値:なし
- 処理内容:
- メンバ変数timeとalarmTimeの値を比較して同じなら、「アラームが鳴りました!」と表示する
- setAlarmメソッドを作成する
- 引数:time:String型
- 戻り値:なし
- 処理内容:
- 引数で与えられた値を、メンバ変数alarmTimeに代入する
提供コード
下記のMain.javaを作成した他のソースファイルと同じフォルダ内に保存して動作確認し、実行結果が得られることを確認してください。
public class Main { public static void main(String[] args) { Clock clock = new Clock("10:30"); clock.showTime(); AlarmClock alarmClock = new AlarmClock("14:30"); alarmClock.showTime(); alarmClock.setAlarm("14:00"); alarmClock.alarm(); alarmClock.setAlarm("14:30"); alarmClock.alarm(); } }
実行結果
10:30です。 14:30です。 アラームが鳴りました!
(解答はこちら)
Q004
問題
下の仕様に基づいて、各クラスを作成してください。
(仕様)
四角形を表すRectAngleクラスを作成します。次のメンバ変数、コンストラクタ、メソッドを作成し、RectAngle.javaとして保存します。
- メンバ変数を作成する
- 幅を表すhabaをint型で宣言する
- 高さを表すtakasaをint型で宣言する
- コンストラクタを作成する
- 引数:
- haba:int型
- takasa:int型
- 処理内容:引数で与えられた値を、同名のメンバ変数に代入する。
- 引数:
- getMensekiメソッドを作成する
- 引数:なし
- 戻り値:int型
- 処理内容:メンバ変数habaとtakasaの積を戻り値として返す
正方形を表すSquareクラスを、RectAngleクラスを継承して作成します。
次のコンストラクタを追加し、Square.javaとして保存します。
- コンストラクタを作成する
- 引数: ippen:int型
- 処理内容:引数で与えられた値をうまく使って、親クラスのコンストラクタを呼び出す
提供コード
下のMain.javaをコメントの指示(①~②)に基づいて追記します。
その後、作成した他のソースファイルと同じフォルダ内に保存して動作確認し、実行結果が得られることを確認してください。
public class Main { public static void main(String[] args) { RectAngle rect = new RectAngle(8, 5); //①rectのもつgetMensekiメソッドを呼び出し、戻り値を表示してください Square square = new Square(10); //②squareのもつgetMensekiメソッドを呼び出し、戻り値を表示してください } }
実行結果
40 100
(解答はこちら)
解答編
それでは、解答編です。
Q001
(Employee.java)
public class Employee { String name; void operation() { System.out.println( this.name + "は通常業務を行ないます。"); } }
(Manager.java)
public class Manager extends Employee{ void management() { System.out.println( this.name + "は管理業務を行ないます。" ); } }
(Main.java)
public class Main { public static void main(String[] args) { Employee taro = new Employee(); taro.name = "タロウ"; Manager hanako = new Manager(); hanako.name = "ハナコ"; taro.operation(); //① hanako.operation(); //② hanako.management(); //③ } }
(問題に戻る)
Q002
(Fighter.java)
public class Fighter { public String name; public int atk; Fighter() { this.name = "戦士"; this.atk = 10; } void attack() { System.out.println(this.name + "の攻撃!"); System.out.println("敵に" + this.atk + "のダメージ!!" ); } }
(MagicFighter.java)
public class MagicFighter extends Fighter { public int mp; MagicFighter() { this.name = "魔法戦士"; this.mp = 20; } void attack() { System.out.println(this.name + "の魔法攻撃!"); System.out.println( "敵に" + (this.atk + this.mp) + "のダメージ!"); } }
(問題に戻る)
Q003
(Clock.java)
public class Clock { public String time; Clock( String time ){ this.time = time; } void showTime() { System.out.println(this.time + "です"); } }
(AlarmClock.java)
public class AlarmClock extends Clock{ public String alarmTime; AlarmClock(String time) { super(time); } void setAlarm(String time) { this.alarmTime = time; } void alarm() { if (time.equals(alarmTime)) { System.out.println("アラームが鳴りました!!"); } } }
(問題に戻る)
Q004
(Rectangle.java)
public class RectAngle { int haba; int takasa; RectAngle( int haba, int takasa ) { this.haba = haba; this.takasa = takasa; } int getMenseki() { return this.haba * this.takasa; } }
(Square.java)
public class Square extends RectAngle { Square(int ippen) { super(ippen, ippen); } }
(Main.java)
public class Main { public static void main(String[] args) { RectAngle rect = new RectAngle(8, 5); System.out.println(rect.getMenseki()); //① Square square = new Square(10); System.out.println(square.getMenseki());//② } }
解説
Squareのコンストラクタを作成する部分がポイントです。正方形は四角形の特徴を持ち、なおかつすべての辺の長さが同じ。という特徴を備えています。本来の正方形+αの特徴を持っているので、継承で表現できるというわけです。このテーマは基本情報技術者試験でも出題テーマになっていました。
(問題に戻る)
おわりに
本日は以上となります。最後までご覧くださりありがとうございます。継承は最初のうちは、コンストラクタなどのルールが複雑な面もありますが、慣れてしまうととても便利な機能です。継承の基礎をしっかり固めると、継承を活用する以降のテーマが楽しめると思います。
[PR]
Javaをもっと詳しく学びたい!という方には、下の書籍がおススメです!筆者も愛用しています。