📝
【Java入門】抽象クラスとインタフェースの違いと使い分け
抽象クラスとインタフェースの使い分け【Java基礎】
🔰 はじめに
Javaには、
抽象クラス(abstract class)と
インタフェース(interface)という、
「共通の型を表す」ための機構があります。
この2つは一見似ていますが、
目的や役割が大きく異なります。
そして、試験でも現場でも
「どちらを使うべきか」が問われる場面が多々あります。
本稿では、初心者でも本質を理解できるよう丁寧に解説していきます。
🧱 1. クラス・抽象クラス・インタフェースの関係性
種類 | 特徴 |
---|---|
クラス | 実装がすべてある具象クラス。インスタンスを生成できる。 |
抽象クラス | 一部実装された「設計図」。インスタンス化はできないが、共通処理と部分的な強制(abstract)を含む。 |
インタフェース | 完全な設計書。すべてのメソッドを外部に公開する契約書のようなもの。実装は持たない(Java 8以降、一部例外あり)。 |
📌 2. 抽象クラスの基本ルール
-
abstract
修飾子をクラスに付ける - インスタンス化不可(
new
できない) - 抽象メソッド(中身なしメソッド) を持てる
- 通常のメソッド(中身あり) も持てる
-
private
,protected
,static
などの修飾子も使用可能 - 状態(フィールド)を自由に保持できる
abstract class Animal {
private int age;
public void breathe() {
System.out.println("呼吸してます");
}
abstract void speak(); // 抽象メソッド
}
📌 3. インタフェースの基本ルール
-
interface
キーワードで定義 - すべてのメソッドは
public abstract
(暗黙的に) - すべての変数は
public static final
(定数) - インスタンスフィールドや状態は持てない
- Java 8以降は
default
メソッドやstatic
メソッドも一部利用可能
interface Speakable {
void speak(); // 自動的に public abstract
int MAX_VOLUME = 10; // 自動的に public static final
}
🧠 4. よくある質問と深掘りポイント
abstract
をつけないといけないのはいつ?
Q1. 抽象クラスに → 中身が無いメソッド({}
が無い)を定義する時だけ。
中身がある普通のメソッドは abstract
をつけなくてOK。
private
なメソッドや変数は抽象クラスに使える?
Q2. → ✅ 使える!
共通ロジックを内部に閉じ込めたいときなどに役立つ。
Q3. インタフェースはクラス?
→ ❌ 厳密にはクラスではなく、「仕様」や「契約」のようなもの。
Javaでは interface
と class
は明確に区別されている。
Q4. インタフェース同士の継承はできる?
→ ✅ 可能!
クラスの継承とは違い、複数のインタフェース を拡張できる。
interface A {
void a();
}
interface B extends A {
void b();
}
🎯 5. 両者の使い分けと選び方
比較ポイント | 抽象クラス | インタフェース |
---|---|---|
多重継承 | ❌ 1つだけ継承可 | ⭕ 複数実装可能 |
状態(変数) | ⭕ 任意のフィールドを持てる | ❌ 定数(public static final )だけ |
処理の共通実装 | ⭕ 可能(通常メソッド) | ⭕ 一部可能(default メソッド) |
拡張の柔軟性 | ◯ サブクラスへロジック継承可 | ◎ 複数のインタフェースで拡張可能 |
主な用途 | 共通のロジックをまとめる | 共通の振る舞いを定義する |
✅ 結論:インタフェースと抽象クラスの選び方
- 共通の処理や状態を「ある程度まとめたい」 → 抽象クラス
- 実装にはタッチせず、共通の振る舞いだけ定義したい → インタフェース
🧪 6. 試験対策ワンポイントまとめ(Java Bronze 向け)
- 抽象クラス内では
abstract
メソッドと通常メソッドの両方を定義できる。 - インタフェースでは、メソッドは常に
public abstract
(省略可)。 - インタフェースの変数は
public static final
(定数)。 -
abstract
メソッドには中身{}
を書かない。 - 抽象クラスはインスタンス化できない(コンパイルエラー)。
📣 最後に
「抽象クラスとインタフェース」は
Javaの設計力に直結する重要な要素です。
この2つを正しく使い分けられるようになると、保守性の高いコード、再利用性の高い設計ができるようになります。
🔑 抽象クラスは「部分的に共通する処理の土台」、
インタフェースは「共通する契約」
として捉えると理解しやすくなります!
Discussion