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

オブジェクト指向を理解するための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エンジニア