インターフェースは、実装がない (またはほぼない) 契約 — 型が提供する必要があるメソッドのセット — を宣言します。抽象クラスは、部分的に実装されたクラスであり、共有状態と具象メソッドを保持できますが、インスタンス化できません。重要な違い: クラスは多くのインターフェースを実装できますが、1つのクラスからのみ継承できます。
インターフェースは、実装がない (またはほぼない) 契約 — 型が提供する必要があるメソッドのセット — を宣言します。抽象クラスは、部分的に実装されたクラスであり、共有状態と具象メソッドを保持できますが、インスタンス化できません。重要な違い: クラスは多くのインターフェースを実装できますが、1つのクラスからのみ継承できます。
| インターフェース | 抽象クラス |
|---|
| インスタンス化可能 | いいえ | いいえ |
| 多重継承 | はい (多数実装) | いいえ (単一の基底) |
| フィールド / 状態 | いいえ (定数のみ*) | はい |
| メソッド本体 | デフォルトメソッドのみ* | はい、完全に |
| モデル | 能力 ("できること") | is-a と共有コード |
*最新の Java は default メソッドと定数を許可します。本質は変わりません。
interface Drawable { // a capability
void draw();
}
abstract class Shape { // shared identity + state
protected String color;
Shape(String color) { this.color = color; }
abstract double area(); // subclasses must define
String describe() { // shared concrete behavior
return color + " shape, area=" + area();
}
}
class Circle extends Shape implements Drawable {
private double r;
Circle(String c, double r) { super(c); this.r = r; }
double area() { return Math.PI * r * r; }
public void draw() { /* render */ }
}
Circle は Shape である (1つの基底、共有コード) かつ Drawable である (混合された能力)。
選択を誤るとデザインが固定されます: 抽象基底は単一の継承行を強制しますが、インターフェースは型が能力を組み合わせることを自由に保ちます。
インターフェースは疎結合の優先デフォルトです — 具体的な階層ではなく契約に依存することで、コードの測定性と拡張性が保たれます。