こんにちは。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をもっと詳しく学びたい!という方には、下の書籍がおススメです!筆者も愛用しています。



