前回に引き続き、継承の問題です。継承される側と、継承する側の関係性に要注意!

問題 - コンストラクタ「難易度:中」

次のようにFruitクラスを定義しました。オブジェクトを生成したときに呼び出されるコンストラクタには「くだもの」と出力するコードを記述しています。

class Fuite {
    Fruit() {
        System.out.println("くだもの");
    }
}

AppleクラスはFruitクラスを継承したクラスとして、次のように定義しました。コンストラクタには「りんご」と出力するコードを記述しています。

class Apple extends Fruit {
    Apple() {
        System.out.println("りんご");
    }
}

次のようにAppleクラスからオブジェクトを生成すると、どのように出力されるでしょうか?

Apple apple = new Apple();

前回に引き続き、継承の問題です。継承される側と、継承する側の関係性に要注意!

問題 - コンストラクタ「難易度:中」

次のようにFruitクラスを定義しました。オブジェクトを生成したときに呼び出されるコンストラクタには「くだもの」と出力するコードを記述しています。

class Fuite {
    Fruit() {
        System.out.println("くだもの");
    }
}

AppleクラスはFruitクラスを継承したクラスとして、次のように定義しました。コンストラクタには「りんご」と出力するコードを記述しています。

class Apple extends Fruit {
    Apple() {
        System.out.println("りんご");
    }
}

次のようにAppleクラスからオブジェクトを生成すると、どのように出力されるでしょうか?

Apple apple = new Apple();

解答

くだもの
りんご
と出力される。

解説

Appleクラスからオブジェクトを生成すると、Appleクラスのコンストラクタが呼び出されるので「りんご」と出力されます。ところが、AppleクラスはFruitクラスを継承しているので、その前にFruitクラスのコンストラクタが暗黙的に呼び出されます。その結果、まず「くだもの」と出力され、次に「りんご」と出力されます。クラスを継承する際は、継承される側(スーパークラス)のコンストラクタと、継承する側(サブクラス)のコンストラクタの動作に注意が必要です。

これでJava編はいったん終わりです。ではまたお会いしましょう!