前回に引き続き、継承の問題です。継承される側と、継承する側の関係性に要注意!
問題 - コンストラクタ「難易度:中」
次のように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編はいったん終わりです。ではまたお会いしましょう!