Java のオブジェクト指向を学ぶ上で欠かせない概念が 抽象クラス(abstract class)とインタフェース(interface)です。本記事では、両者の違いや関係性、そして実践での使い分け方について分かりやすく解説します。
1. 抽象クラス(abstract class)とは
抽象クラスは、共通の性質や動作をまとめるための基底クラス(スーパークラス)です。
一部のメソッドを抽象メソッド(中身なし)として宣言し、サブクラスに実装を必須とさせることができます。
特徴
・abstract キーワードで宣言
・抽象メソッドを含めることができる
・フィールド(状態)を持てる
・具象メソッド(処理あり)も持てる
・単一継承(クラスの継承は1つのみ)
例
abstract class Animal {
String name; // フィールド(状態)
abstract void makeSound(); // 抽象メソッド
void eat() { // 具象メソッド
System.out.println(name + " is eating.");
}
}
2. インタフェース(interface)とは
インタフェースは、クラスが実装すべき機能の仕様を定義するための型です。
Java8以降では、defaultメソッドやstaticメソッドも定義可能になり、柔軟性が増しています。
特徴
・interface キーワードで宣言
・フィールドはすべて public static final(定数)
・メソッドはデフォルトで public abstract
・Java8 以降:default・static メソッドを持てる
・Java9 以降:private メソッドも定義可能
・複数のインタフェースを実装できる
例
interface Flyable {
void fly(); // 抽象メソッド(public abstract)
}
抽象クラスとインタフェースの違い(一覧表)
| 項目 | 抽象クラス | インタフェース |
|---|---|---|
| フィールド | あり(自由) | 定数のみ |
| メソッド | 抽象・具象どちらもOK | 抽象 + default + static |
| コンストラクタ | 持てる | 持てない |
| 継承・実装 | クラスは1つのみ継承 | 複数のインタフェースを実装可 |
| 目的 | 共通の性質・状態をまとめる | 共通の能力・API契約を示す |
「関係性」
● 抽象クラスを選ぶとき
・共通の変数(状態)を持たせたいとき
・共通処理をまとめたいとき(具象メソッドが多い)
・クラス階層をデザインしたいとき(is-a の関係)
例:
Animal → Dog / Cat
Vehicle → Car / Bike
● インタフェースを選ぶとき
・共通の「能力」を表したい
・複数の型に共通の動作を与えたい
・API として契約を定義したい
例:
Flyable = 「飛べる」
Comparable = 「比較できる」
Runnable = 「実行できる」
両方を併用することもある
実際の開発では、以下のような使い分けが一般的です:
抽象クラス:基本となる共通機能を提供
インタフェース:追加機能や能力を付与
例
abstract class Animal {
abstract void makeSound();
}
interface Flyable {
void fly();
}
class Bird extends Animal implements Flyable {
@Override
void makeSound() { System.out.println("Chirp"); }
@Override
public void fly() { System.out.println("Flying"); }
}
7. まとめ
| 要点 | 内容 |
|---|---|
| 抽象クラス | 共通の性質・状態・処理をまとめる基底クラス |
| インタフェース | クラスが実装すべき能力・契約を定義する型 |
| 関係性 | 目的が異なるが、組み合わせることで柔軟な設計が可能 |
| 実務上の使い分け | 状態=抽象クラス、契約=インタフェース、多重実装=インタフェース |