本文へスキップ
BecomeCoder

Javaオブジェクト指向コース · 第3章 継承 ― クラスを拡張する · レッスン10

継承の注意点 ― is-a の関係と、次章への入り口

ブラウザで完結

導入

継承はとても便利ですが、使いどころを間違えると混乱のもとになります。最後に、継承を使うべき場面の見極め方と、次の章で本格的に学ぶ「オーバーライド」の入り口を見ておきましょう。

説明

継承を使うべきかどうかの目安は、「AはBの一種か?(is-a の関係)」 が成り立つかどうかです。「犬は動物の一種」「学生は人間の一種」は成り立つので継承が向いています。一方、「車はエンジンを持っている」は “has-a”(持っている)の関係であり、“is-a”(〜の一種)ではないので、継承ではなく別の仕組み(フィールドとして持たせる)で表すべきです。

もう1つ、継承には大事な機能があります。親クラス同じ名前・同じ引数のメソッド を子クラスで定義すると、親の処理を「上書き」できます。これを オーバーライド と呼びます。

public class Main {
    public static void main(String[] args) {
        Animal a = new Animal();
        a.sound();
        Dog d = new Dog();
        d.sound();
    }
}

class Animal {
    void sound() {
        System.out.println("鳴く");
    }
}

class Dog extends Animal {
    @Override
    void sound() {
        System.out.println("ワン!");
    }
}

DogAnimalsound() と同じ名前のメソッドを定義することで、内容を「ワン!」に上書きしています。@Override は「これは親のメソッドを上書きするものです」という目印(アノテーション)です。オーバーライドについては、次の第4章で詳しく学びます。

やってみよう

下のエディタを実行し、AnimalDogsound() の中身が違うことを確認しましょう。@Override を消しても動くこと(ただしコンパイラのチェックが効かなくなる)も確認してみてください。

演習

Cat extends Animal を作り、sound()"ニャー!" と表示するようにオーバーライドしてください。mainnew Cat() を作って sound() を呼んでください。

ヒント1を見る

class Cat extends Animal { @Override void sound() { System.out.println("ニャー!"); } }

ヒント2を見る

mainCat c = new Cat(); c.sound();

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。