Javaプログラミング練習問題(継承)

Java

こんにちは。ECF Tech
ブログ担当 Michiharu.Tです。

Javaプログラミング向け練習問題、オブジェクト指向プログラミング編。今回はオブジェクト指向プログラミングの要ともいえる継承です。
継承の内容がイメージしやすいシンプルな内容をメインに出題してみました。ぜひ、チャレンジしてみてください。

一般的な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のコンストラクタを作成する部分がポイントです。正方形は四角形の特徴を持ち、なおかつすべての辺の長さが同じ。という特徴を備えています。本来の正方形+αの特徴を持っているので、継承で表現できるというわけです。このテーマは基本情報技術者試験でも出題テーマになっていました。

(問題に戻る)

おわりに

本日は以上となります。最後までご覧くださりありがとうございます。継承は最初のうちは、コンストラクタなどのルールが複雑な面もありますが、慣れてしまうととても便利な機能です。継承の基礎をしっかり固めると、継承を活用する以降のテーマが楽しめると思います。


合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。

ECFエデュケーション
タイトルとURLをコピーしました