📝

【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. よくある質問と深掘りポイント

Q1. 抽象クラスに abstract をつけないといけないのはいつ?

→ 中身が無いメソッド({}が無い)を定義する時だけ。
中身がある普通のメソッドは abstract をつけなくてOK。


Q2. private なメソッドや変数は抽象クラスに使える?

→ ✅ 使える!
共通ロジックを内部に閉じ込めたいときなどに役立つ。


Q3. インタフェースはクラス?

→ ❌ 厳密にはクラスではなく、「仕様」や「契約」のようなもの。
Javaでは interfaceclass は明確に区別されている。


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