Java インターフェース vs 抽象クラス:適切な抽象化の選び方
インターフェースとは?
Java におけるインターフェースは、クラスが実装できる契約を定義します。インターフェースで宣言されるすべてのメソッドはデフォルトで抽象的であり、本体を持ちません。インターフェースは直接インスタンス化できず、振る舞いを記述するだけです。
インターフェースはインスタンス変数を保持できませんが、public static final 修飾子で定数を宣言できます。
抽象クラスとは?
抽象クラスはインスタンス化できないクラスで、抽象メソッド(本体なし)と具象メソッド(実装あり)の両方を含められます。少なくとも1つの抽象メソッドが必要です。
抽象クラスはサブクラスの青写真として機能し、親が定義した抽象メソッドを子が実装しなければなりません。
インターフェースと異なり、抽象クラスはインスタンスフィールドで状態を保持でき、デフォルト振る舞いを提供できます。
なぜインターフェースを使うか?
- 特定実装に縛られずに振る舞いをカプセル化
- 実行時の動的ディスパッチとポリモーフィズムを実現
- メソッドシグネチャを継承階層から分離し、疎結合を促進
- クラスが複数のインターフェースを実装でき、柔軟な設計が可能
なぜ抽象クラスを使うか?
- サブクラスで再利用できる共有コードを提供
- 関連クラスのテンプレートを提供し、共通振る舞いを強制
- インスタンスフィールドで状態を持てる
- 単一親クラスに制限することで継承を制御
インターフェース vs 抽象クラス
両方とも契約定義に役立ちますが、実装と用途が異なります。インターフェースはメソッド宣言のみ可能ですが、抽象クラスはデフォルト実装を提供できます。クラスは1つの抽象クラスしか継承できませんが、複数のインターフェースを実装できます。
| 観点 | インターフェース | 抽象クラス |
|---|---|---|
| ルックアップ速度 | 動的ディスパッチのため一般的に遅い | 可能なら静的ディスパッチで高速 |
| 多重継承 | 複数インターフェース実装をサポート | 単一継承のみ |
| メソッド本体 | 抽象のみ(Java 8 以前)または default/static(Java 8+) | 抽象と具象の両方を含められる |
| 状態 | インスタンスフィールド宣言不可 | インスタンスフィールドとコンストラクタ宣言可 |
| ユースケース | 無関係なクラスに混入できる能力を定義 | 共有実装を持つ共通基盤を提供 |
| メンバーのアクセス性 | すべて暗黙的に public | protected、public、private 可 |
| 他型の拡張 | 他インターフェースを拡張可能 | クラスを拡張し、インターフェース実装可 |
| コンストラクタ | 定義不可 | サブクラス用コンストラクタ定義可 |
| 定数 | 定数宣言可(public static final) | 定数と通常フィールドの両方可 |
サンプルコード:Java のインターフェースと抽象クラス
以下はインターフェースと抽象クラスの宣言・使用例です。
インターフェース構文
interface Name {
// メソッド宣言
}
Java インターフェース例
interface Pet {
void test();
}
class Dog implements Pet {
public void test() {
System.out.println("Interface method implemented");
}
public static void main(String[] args) {
Pet p = new Dog();
p.test();
}
}
抽象クラス構文
abstract class Name {
// コード
}
抽象クラス例
abstract class Shape {
int b = 20;
abstract void calculateArea();
}
class Rectangle extends Shape {
public static void main(String[] args) {
Rectangle obj = new Rectangle();
obj.b = 200;
obj.calculateArea();
}
void calculateArea() {
System.out.println("Area is " + (b * b));
}
}
Java
- フォアハンド溶接 vs バックハンド溶接:違いと使い分け
- 鉄 vs 鋼:組成・特性・用途の決定的違い
- 切断釘 vs 線釘:建設用途での主要違いを理解する
- プラズマ切断 vs レーザー切断:違いと使い分け
- 旋盤面取り vs フライス面取り:主な違いを理解する
- フライス加工 vs 研削加工:主な違いを解説
- DC モーター vs AC モーター:構造の違いと用途別の選び方
- Java抽象クラスとメソッド:包括的ガイド
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java抽象化完全ガイド: 抽象クラス・抽象メソッドで実装を隠蔽し設計を簡潔に
- Javaインターフェース完全ガイド: 定義・実装・多重継承・タグインターフェース