Javaの抽象クラスとインターフェースの違いとは?使い分けの考え方

最終更新日

Schoo Java入門 初級【2026年版】第7回 継承とインターフェース

本記事は、Schooの「Java入門 初級【2026年版】」第7回「継承とインターフェース」を学ぶ前後に、Javaの抽象クラスとインターフェースの違いを整理したい方向けのステップアップ学習記事です。

ただし、Schooを受講していない方でも、継承、オーバーライド、抽象クラス、インターフェースの基本を学んだあとに読み進められる内容にしています。

Schoo コースページ:Java入門 初級【2026年版】

抽象クラスとインターフェースは、どちらも子クラスや実装クラスにメソッドを作らせる場面で登場します。そのため初学者には似て見えますが、考え方の中心は少し違います。

抽象クラスは共通処理を持てる親クラス

抽象クラスは、継承して使うことを前提にした親クラスです。共通のフィールドや共通のメソッドを持ちながら、子クラスで必ず作る処理も決められます。

public abstract class User {
    protected String name;

    public void printName() {
        System.out.println("名前:" + name);
    }

    public abstract String getRoleName();
}

printName() は共通処理として親クラスに書けます。一方、getRoleName() は子クラスごとに違うため、抽象メソッドとして形だけを決めています。

インターフェースは共通の呼び方を決める約束

インターフェースは、クラスに共通の使い方を決める仕組みです。たとえば、Display インターフェースでは show() を持つことを決められます。

public interface Display {
    void show();
}

TextDisplay でも NumberDisplay でも、Display を実装するなら show() を作ります。中身は違っても、呼び出し方をそろえられる点が特徴です。

図解:抽象クラスは共通処理、インターフェースは共通の呼び方
抽象クラス
共通処理を持てる親クラス
name などのフィールドを持てる
printName() などの共通処理を書ける
子クラスに作らせたい抽象メソッドも決められる
インターフェース
共通の呼び方を決める約束
show() を持つ、という使い方を決める
実際の中身は実装クラスに書く
違う種類のクラスを同じ呼び方で扱いやすい
最初は、抽象クラスは「共通処理を持てる親クラス」、インターフェースは「共通の呼び方を決める約束」と分けて考えると整理しやすくなります。

extendsとimplementsの違い

抽象クラスを親クラスとして引き継ぐときは extends を使います。インターフェースで決めた使い方をクラスで実装するときは implements を使います。

public class AdminUser extends User {
    @Override
    public String getRoleName() {
        return "管理者";
    }
}
public class TextDisplay implements Display {
    @Override
    public void show() {
        System.out.println(text);
    }
}

extends は親クラスとの関係、implements はインターフェースの約束を実装する関係です。どちらもオーバーライドが関係しますが、何を引き継ぐのか、何を約束するのかが違います。

図解:extends と implements の違い
抽象クラスを継承する
public class AdminUser
    extends User {
  @Override
  public String getRoleName() {
    return “管理者”;
  }
}
インターフェースを実装する
public class TextDisplay
    implements Display {
  @Override
  public void show() {
    System.out.println(text);
  }
}
extends は親クラスを継承するとき、implements はインターフェースを実装するときに使います。

抽象クラスは基本的に1つ、インターフェースは複数実装できる

Javaでは、クラスの継承は基本的に1つだけです。そのため、あるクラスが直接 extends できる親クラスは1つです。

public class AdminUser extends User {
    // Userを継承する
}

一方、インターフェースは複数実装できます。たとえば、表示できることと、2行表示できることのように、複数の使い方を1つのクラスに持たせられます。

public class MultiView implements Display, TwoLineDisplay {
    // DisplayとTwoLineDisplayを実装する
}

この違いも、抽象クラスとインターフェースを使い分けるときの判断材料になります。

使い分けの考え方

最初は、次のように考えると整理しやすくなります。

  • 共通のフィールドや共通処理を親クラスに持たせたいなら、抽象クラス
  • 違うクラスでも同じ呼び方で扱いたいなら、インターフェース

どちらを使うべきか迷ったときは、「共通の処理を持たせたいのか」「呼び方だけをそろえたいのか」を見ると判断しやすくなります。

図解:使い分けは「共通処理を持たせたいか」で考える
共通のフィールドや処理がある
nameprintName() のように、親にまとめたい実装があるなら抽象クラスを検討します。
呼び方だけをそろえたい
show() のように、違うクラスを同じ使い方で呼びたいならインターフェースを検討します。
最初から完璧に使い分けようとせず、何をそろえたいのかを見て判断します。

確認問題

  1. 抽象クラスは、共通処理を持てる親クラスと、共通の呼び方を決める約束のどちらに近いですか。
  2. インターフェースは、共通処理を持たせることと、共通の呼び方を決めることのどちらを主な目的にしますか。
  3. extendsimplements は、それぞれどのような場面で使いますか。

演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。

あわせて読みたい関連記事

まとめ

抽象クラスは、共通処理を持てる親クラスです。インターフェースは、クラスに共通の呼び方を決める約束です。抽象クラスは extends で継承し、インターフェースは implements で実装します。最初は、共通処理を持たせたいなら抽象クラス、呼び方をそろえたいならインターフェース、と考えると違いを整理しやすくなります。

シェアする