今回は抽象クラスとインターフェースについて記事にしたいと思います。
抽象クラスとは?
「乗り物」の設計図を作りたいとします。でも、「乗り物」といっても、車や自転車、飛行機などいろいろありますよね。
抽象クラスは、「乗り物」という共通の特徴を持つ設計図のようなものです。
この設計図には、「走る」や「止まる」といった共通の動きが書かれています。
でも、「乗り物」だけでは具体的に何を作るかわかりません。直接使うことはできないのです。
そこで、この「抽象クラス」をもとにして、「車」や「自転車」といった具体的な乗り物の設計図(クラス)を作ります。
「車」は「乗り物」の特徴を受け継ぎつつ、エンジンやタイヤの数など、車特有の情報を追加します。
「自転車」も同様に、「乗り物」の特徴を持ちつつ、ペダルやギアなどを追加します。
つまり、抽象クラスは共通の部分をまとめた「未完成の設計図」で、これをもとに具体的なものを作るための基礎となります。
例
抽象クラス Vehicle(乗り物)
public abstract class Vehicle {
String name;
}
// コンストラクタ
public Vehicle(String name) {
this.name = name;
}
// 共通の動き
public void start() {
System.out.println(name + "が発進します。");
}
public void stop() {
System.out.println(name + "が停止します。");
}
// 抽象メソッド(具体的な実装はしない)
public abstract void soundHorn();
}
具体的な乗り物のクラスを作ります。
// 車クラス
public class Car extends Vehicle {
public Car(String name) {
super(name);
}
// 抽象メソッドを具体的に実装
@Override
public void soundHorn() {
System.out.println(name + "がクラクションを鳴らします:ビッビッ!");
}
}
// 自転車クラス
public class Bicycle extends Vehicle {
public Bicycle(String name) {
super(name);
}
// 抽象メソッドを具体的に実装
@Override
public void soundHorn() {
System.out.println(name + "がベルを鳴らします:チリンチリン!");
}
}
使用例:
public class Main {
public static void main(String[] args) {
Car car = new Car("スポーツカー");
Bicycle bicycle = new Bicycle("マウンテンバイク");
car.start(); // スポーツカーが発進します。
car.soundHorn(); // スポーツカーがクラクションを鳴らします:ビッビッ!
car.stop(); // スポーツカーが停止します。
bicycle.start(); // マウンテンバイクが発進します。
bicycle.soundHorn(); // マウンテンバイクがベルを鳴らします:チリンチリン!
bicycle.stop(); // マウンテンバイクが停止します。
}
}
インターフェースの例
イメージ:
次に、「飛べる」機能を持つものを考えてみましょう。飛行機やヘリコプターなどが該当します。
インターフェースを使ってみましょう。
// インターフェース Flyable(飛べる)
public interface Flyable {
// 飛ぶ機能の約束事
void fly();
}
ポイント:
Flyableインターフェースは、fly()というメソッドを持つことを約束しますが、具体的な実装は書きません。
飛べる乗り物のクラスを作ります。
java
コードをコピーする
// 飛行機クラス
public class Airplane extends Vehicle implements Flyable {
public Airplane(String name) {
super(name);
}
// 抽象メソッドを実装
@Override
public void soundHorn() {
System.out.println(name + "が警告音を鳴らします:ピー!");
}
// インターフェースのメソッドを具体的に実装
@Override
public void fly() {
System.out.println(name + "が空を飛びます。");
}
}
使用例:
public class Main {
public static void main(String[] args) {
Airplane airplane = new Airplane("ジェット機");
airplane.start(); // ジェット機が発進します。
airplane.fly(); // ジェット機が空を飛びます。
airplane.soundHorn(); // ジェット機が警告音を鳴らします:ピー!
airplane.stop(); // ジェット機が停止します。
}
}
今回は抽象クラスとインターフェースについてまとめてみました。