抽象クラスとインターフェース
抽象クラスとインタフェースは、Javaなどのオブジェクト指向プログラミング言語で利用される重要な概念です。
これらは、共通の特性や振る舞いを持つクラスやコードを効果的に扱うための方法です。
抽象クラス(Abstract Class)
抽象クラスは、他のクラスに共通する特性やメソッドをまとめるためのもので、直接インスタンス化することができません。抽象クラスは、その中に抽象メソッド(未実装のメソッド)を含むことができます。
抽象メソッドは本体(メソッドの中身)を持たず、サブクラスで具体的な実装がされることを期待します。
// 抽象クラスの定義
abstract class Animal {
// 抽象メソッド(サブクラスで実装が必要)
abstract void makeSound();
// 通常のメソッドも含むことができます
void sleep() {
System.out.println("Zzz");
}
}
抽象クラスは、共通の振る舞いを持つクラスのテンプレートとして利用されます。例えば、Animal
クラスは makeSound()
メソッドを持つが、どのような音を出すかはサブクラスで実装されることを期待しています。
インタフェース(Interface)
インタフェースは抽象クラスよりもさらに抽象度が高く、メソッドや定数の集まりだけを持ちます。インタフェース内のメソッドはデフォルトで抽象メソッドです(Java 8以降、デフォルトメソッドやstaticメソッドも追加できるようになりました)。
// インタフェースの定義
interface Printable {
void print(); // 抽象メソッド
default void log() {
System.out.println("Logging");
}
}
インタフェースは実装を持たず、クラスがそのインタフェースを実装することで、そのインタフェース内のメソッドを実装する必要があります。1つのクラスが複数のインタフェースを実装することも可能です。
class MyClass implements Printable {
public void print() {
System.out.println("Printing");
}
}
このように、MyClass
クラスは Printable
インタフェースを実装し、print()
メソッドを実装しています。インタフェースは、クラスが特定の振る舞いを実装することを保証するために使われます。
違いと使い分け
- 抽象クラスはフィールド(属性)やコンストラクタ、通常のメソッドを含むことができますが、1つのクラスしか継承できません。
- インタフェースは複数のインタフェースを実装できますが、フィールドやコンストラクタは持たず、メソッドの宣言だけを含みます。
抽象クラスは、共通の振る舞いを持つクラスをグループ化し、インタフェースはクラスが特定の振る舞いを実装することを強制するために使用されます。プロジェクトの設計や要件に応じて、どちらを使用するかを選択します。