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

Java

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

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

一般的なJavaの学習順序に沿ったテーマの一覧(※随時追加)は、こちらのリンクよりご確認頂けます。

Javaプログラミング

Javaのトピックスです。主に初心者向けにプログラミング学習ネタを提供していきます。

問題編

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をString型で宣言する
  • コンストラクタを作成する
    • 引数:なし
    • 処理内容:
      • フィールド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の値を比較して同じなら、「アラームが鳴りました!」と表示する

提供コード

下記の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として保存します。

  • フィールドを作成する
    • 幅を表すwidthをint型で宣言する
    • 高さを表すheightをint型で宣言する
  • コンストラクタを作成する
    • 引数:
      • width:int型
      • height:int型
    • 処理内容:引数で与えられた値を、同名のフィールドに代入する。
  • getMensekiメソッドを作成する
    • 引数:なし
    • 戻り値:なし
    • 処理内容:フィールドwidthとheightの積を戻り値として返す

正方形を表すSquareクラスを、Rectangleクラスを継承して作成します。
次のコンストラクタを追加し、Square.javaとして保存します。

  • コンストラクタを作成する
    • 引数: width: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);
        //②rectのもつgetMensekiメソッドを呼び出し、戻り値を表示してください
    }
}

実行結果

40
100

解答編

それでは、解答編です。

Q001

(Employee.java)

public class Employee {
    String name;

    public void operation() {
        System.out.println( this.name + "は通常業務を行ないます。");
    }
}

(Manager.java)

public class Manager extends Employee{
    public 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;

    public Fighter() {
        this.name = "戦士";
        this.atk = 10;
    }

    public void attack() {
        System.out.println(this.name + "の攻撃!");
        System.out.println("敵に" + this.atk + "のダメージ!!" );
    }
}

(MagicFighter.java)

public class MagicFighter extends Fighter {
    public int mp;

    public MagicFighter() {
        this.name = "魔法戦士";
        this.mp = 20;
    }

    public void attack() {
        System.out.println(this.name + "の魔法攻撃!");
        System.out.println( "敵に" + (this.atk + this.mp) + "のダメージ!");
    }
}

Q003

(Clock.java)

public class Clock {
    public String time;

    public Clock( String time ){
        this.time = time;
    }

    public void showTime() {
        System.out.println(this.time + "です");
    }
}

(AlarmClock.java)

public class AlarmClock extends Clock{
    public String alarmTime;

    public AlarmClock(String time) {
        super(time);
    }

    public void setAlarm(String time) {
        this.time = time;
    }

    public void alarm() {
        if (time.equals(alarmTime)) {
            System.out.println("アラームが鳴りました!!");
        }
    }
}

Q004

(Rectangle.java)

public class RectAngle {
    int width;
    int height;

    public RectAngle( int width, int height ) {
        this.width = width;
        this.height = height;
    }

    public int getMenseki() {
        return this.width * this.height;
    }
}

(Square.java)

public class Square extends RectAngle {    
    public Square(int width) {
        super(width, width);
    }
}

(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エデュケーション
キッズも大人も。沖縄からITのマナビを応援します
タイトルとURLをコピーしました