本日は、オブジェクト指向のJavaでは避けては通れないクラスの継承に関する問題です。わかるかな?

問題 - 継承「難易度:高」

Fruitクラスは、String型のメンバ変数categoryとメンバ変数categoryの中身を出力するメソッドshowCategoryを定義したクラスです。メンバ変数categoryには初期値として「くだもの」をセットしています。

class Fuite {
    String category = "くだもの";
    public void showCategory() {
        System.out.println(category);
    }
}

AppleクラスはFruitクラスを継承したクラスとして次のように定義しました。

class Apple extends Fruit {
    String category = "りんご";
}

次のようにAppleクラスからオブジェクトを生成し、showCategoryメソッドを呼び出すと何と出力されるでしょうか?

Apple apple = new Apple();
apple.showCategory();

本日は、オブジェクト指向のJavaでは避けては通れないクラスの継承に関する問題です。わかるかな?

問題 - 継承「難易度:高」

Fruitクラスは、String型のメンバ変数categoryとメンバ変数categoryの中身を出力するメソッドshowCategoryを定義したクラスです。メンバ変数categoryには初期値として「くだもの」をセットしています。

class Fuite {
    String category = "くだもの";
    public void showCategory() {
        System.out.println(category);
    }
}

AppleクラスはFruitクラスを継承したクラスとして次のように定義しました。

class Apple extends Fruit {
    String category = "りんご";
}

次のようにAppleクラスからオブジェクトを生成し、showCategoryメソッドを呼び出すと何と出力されるでしょうか?

Apple apple = new Apple();
apple.showCategory();

解答

「くだもの」と出力される。

解説

FruitクラスのshowCategoryメソッドは、メンバ変数categoryを出力するメソッドです。Fruitクラスではメンバ変数categoryの初期値に「くだもの」をセットしているので、Fruitクラスから生成したオブジェクトからshowCategoryメソッドを呼び出すと、「くだもの」と出力されます。 今回は、Fruitクラスを継承したAppleクラスの定義でメンバ変数categoryに「りんご」とセットしているので、Appleクラスから生成したオブジェクトからshowCategoryメソッドを呼び出すと、「りんご」と出力されそうです。しかし、出力されるのは「くだもの」です。 実は、Appleクラスで定義したメンバ変数categoryは、Fruitクラスのメンバ変数categoryと名前は同じですが、継承されるメンバ変数categoryではなく、まったく別の新しい変数なのです。showCategoryメソッドは、Fruitクラスから継承されたメンバ変数categoryの値を出力するメソッドであり、Appleクラスで定義している別のメンバ変数categoryの値を出力するメソッドではないので、継承されたメンバ変数の値「くだもの」を出力します。

クラスの継承って、ややこしいですね。がんばって!