talosのプログラミング教室

はじめてのJava ~継承編~

スポンサーリンク

f:id:talosta:20200328175524p:plain

今回はJava継承について説明します。

継承オブジェクト指向でとても重要な機能なのでしっかり覚えましょう。

継承とは

継承とはあるクラスの状態と動作を別のクラスが引き継ぐことです。

継承をすることによって、コードの効果的な再利用ができるようになります。

例えば消防車とトラックは両方とも車です。

したがって赤い文字の部分は共通しています。

f:id:talosta:20190612134628p:plain

そこで、車クラスを実装することで、消防車クラスとトラッククラスの実装が楽になります。

f:id:talosta:20190612135953p:plain

車クラスのような継承される側のクラスをスーパークラス、消防車クラスやトラッククラスのような継承する側のクラスをサブクラスと言います。

Javaにおける継承の方法

まず車クラスを用意しました。

class Car {
    int tire;
    int handle;
    int accelerator;
    int brake;

    void move() {
        System.out.println("The car is moving.");
    }

    void turn() {
        System.out.println("The car is turning.");
    }
}

継承は「extends」によって行います。

class FireTruck extends Car {  // 継承
    int hose;

    void sprayWater() {
        System.out.println("The fire truck is spraying the water.");
    }
}
class Main {
    public static void main(String args[]) {
        FireTruck ft = new FireTruck();

        ft.move();
        ft.turn();
        ft.sprayWater();
    }
}
// 出力
The car is moving.
The car is turning.
The fire truck is spraying the water.

MainクラスではFireTruckクラスのオブジェクトを生成していますが、スーパークラスのmove()メソッドとturn()メソッドも呼び出すことができていますね。

オーバーライド

先程はFireTruckクラスのオブジェクトを生成し、Carクラスのメソッドを呼び出しました。

しかし、出力は「The car is moving.」となっています。

これだと消防車なのかわかりません。

そこでオーバーライドをします。

オーバーライドとはスーパークラスメソッドサブクラスメソッドによって上書きすることです。

オーバーライドをすることで、スーパークラスメソッドサブクラスオブジェクトから見えなくなります。

オーバーライドのやり方を見てみましょう。

class FireTruck extends Car {
    int hose;

    void sprayWater() {
        System.out.println("The fire truck is spraying the water.");
    }

    // オーバーライド
    void move() {
        System.out.println("The fire truck is moving.");
    }

    // オーバーライド
    void turn() {
        System.out.println("The fire truck is turning.");
    }
}
// 出力
The fire truck is moving.
The fire truck is turning.
The fire truck is spraying the water.

サブクラスメソッドを再定義するだけですね。

これでCarクラスで定義したメソッドもFireTruckクラス用に修正することができました。


ちなみにオーバーライドに似た言葉でオーバーロードというものがあります。

こちらの記事で説明していますので、知らない方は読んでみてください。

talosta.hatenablog.com

おわりに

今回はJava継承について説明しました。

次回は抽象クラスインタフェースについて説明します。