【技術知識】絶対に分かるオブジェクト指向の概念-③プログラム作成

今回は、「オブジェクト指向」の概念について、実際にJavaでプログラムを書いていきたいと思います。

オブジェクト指向を理解するための3つのステップ

  1. オブジェクト指向がなぜ必要になったかを知る
  2. オブジェクト指向の概念を知る
  3. オブジェクト指向でプログラムを作ろう

オブジェクト指向が必要なった背景、Javaの誕生については以下の記事をご覧ください。

【技術知識】絶対に分かるオブジェクト指向の概念-①Javaの誕生

オブジェク指向の概念を知りたい方は、以下の記事をご覧ください。

【技術知識】絶対に分かるオブジェクト指向の概念-②概念の解説

今回紹介するソースコードについて

全て、github上に公開しております。

https://github.com/hiro-engineer/java-sample-object-orientation

実際に自分で動かしてみたい人は、上のリンクからどうぞ。

継承をしてみよう

分かりやすくするために、少し例を変えます。

前回の記事(オブジェクト指向の概念を知る)で紹介しました「自動車」を例として継承を試してみたいと思います。

まずは、「自動車」のクラスを作成しましょう。

public class Car {
    public void run() {
        System.out.println("道路を走る");
    }

    public void stop() {
        System.out.println("止まる");
    }

    public void turn(String direction) {
        System.out.println(direction + "に曲がる");
    }
}

今回は「自動車」クラスに3つのメソッドを用意しました。

実際に、それぞれのメソッドを呼び出してみましょう。

public class Application {
    public static void main(String[] args) {
        System.out.println("Car クラスの処理ここから");
        Car car = new Car();
        car.run();
        car.turn("右");
        car.stop();
    }
}

======出力結果========
Car クラスの処理ここから
道路を走る
右に曲がる
止まる

3つのメソッド全てが呼び出されました、ここまでは単なるクラスのメソッド呼び出しです。

ここから継承を行ってみます。

今回は、Taxiクラスを用意し、先ほど作成した「自動車」クラスを継承させます

public class Taxi extends Car {
}

「extends Car」の部分で継承を行っております。

Taxiクラスは、Carクラスを継承しているので、Carクラスの持つ3つのメソッドを呼び出す事が可能です。

実際に呼び出してみましょう。

public class Application {
    public static void main(String[] args) {
        System.out.println("Taxi クラスの処理ここから");
        Taxi taxi = new Taxi();
        taxi.run();
        taxi.turn("左");
        taxi.stop();
    }
}
======出力結果========
Taxi クラスの処理ここから
道路を走る
左に曲がる
止まる

3つとも呼び出す事ができました。

次に、Carクラスには無いが、Taxiクラスだけに実装したいメソッドを実装します。

public class Taxi extends Car {
    public void payfee() {
        System.out.println("料金を支払う");
    }
}

料金を支払うのは、自動車には不要ですが、タクシーには必要です。

この状態では、Carクラスの持つ3つのメソッドに加え、Taxiクラスの持つメソッドも呼び出す事が可能です

public class Application {
    public static void main(String[] args) {
        Car car = new Car();
        System.out.println("Car クラスの処理ここから");
        car.run();
        car.turn("右");
        car.stop();
        taxi.payfee(); // ← Carクラスは呼び出せない

        System.out.println("Taxi クラスの処理ここから");
        Taxi taxi = new Taxi();
        taxi.payfee(); // ← Taxiクラスのみ呼び出せる
        taxi.run();
        taxi.turn("左");
        taxi.stop();
    }
}
======出力結果========
Car クラスの処理ここから
道路を走る
右に曲がる
止まる
Taxi クラスの処理ここから
料金を支払う
道路を走る
左に曲がる

オーバーライド

続きて、継承における大事な機能である「オーバーライド」についてもプログラムを書いてみましょう。

オーバーライドとは、処理の書き換えを行うことを意味します。

例えば、電気自動車クラス(ElectricCar)を用意してみましょう。

public class ElectricCar extends Car {
}

Carクラスを継承しているので、走る、止まる、曲がるといった自動車の基本機能を、ElectricCarクラスも持っています。

しかし、ここで問題が発生しました。

ElectricCarクラスは、走る方法が、Carクラスと異なります

ElectricCarクラスは電力で走るため、run()メソッドを上書きしたい、そのような時にオーバーライドを使用します。

public class ElectricCar extends Car {

    @Override
    public void run() {
        System.out.println("電力で走る");
    }
}

この状態で、ElectricCarクラスを呼び出してみましょう。

public class Application {
    public static void main(String[] args) {
        System.out.println("ElectricCar クラスの処理ここから");
        ElectricCar electricCar = new ElectricCar();
        electricCar.run();
        electricCar.turn("左");
        electricCar.stop();
    }
}
======出力結果========
ElectricCar クラスの処理ここから
電力で走る // ← 処理が上書きされている
左に曲がる
止まる

期待通り、run()メソッドが上書きされ、「電力で走る」という出力に変わりました。

実装(implements)

最後に、実装(implements)による処理を作ってみましょう。

「implements」で処理を行うには、まず「インターフェース」を用意する必要があります。

ここでは、自動車に水上を走る機能を実装したいと仮定して、「DriveWater」というインターフェースを準備します。

public interface DriveWater {
    void runOnWater();
}

そして、水陸両用車クラス(AmphibiousVehicle)を準備し、先程のインターフェースを実装します。

public class AmphibiousVehicle extends Car implements DriveWater {

    @Override
    public void runOnWater() {
        System.out.println("水上を走る");
    }
}

最後に、AmphibiousVehicleクラスを呼び出してみましょう。

public class Application {
    public static void main(String[] args) {
        System.out.println("AmphibiousVehicle クラスの処理ここから");
        AmphibiousVehicle amphibiousVehicle = new AmphibiousVehicle();
        amphibiousVehicle.runOnWater();
        amphibiousVehicle.run();
        amphibiousVehicle.turn("左");
        amphibiousVehicle.stop();
    }
}
======出力結果========
AmphibiousVehicle クラスの処理ここから
水上を走る
道路を走る
左に曲がる
止まる

水上を走る、道路を走る、どちらも処理が実行できました。

これで、オブジェクト指向のプログラム作成は終わりです。

===============

この情報が皆さんの人生のお役に立てれば幸いです。

エンジニアとして日本のITリテラシーを高めていきたいと共感して頂いた人は、是非このブログの拡散とyoutubeの方も見ていただけると嬉しいです。

記事を最後まで見ていただきありがとうございました。

執筆者: hiroエンジニア

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です