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

本記事は、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() を作ります。中身は違っても、呼び出し方をそろえられる点が特徴です。
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 はインターフェースを実装するときに使います。抽象クラスは基本的に1つ、インターフェースは複数実装できる
Javaでは、クラスの継承は基本的に1つだけです。そのため、あるクラスが直接 extends できる親クラスは1つです。
public class AdminUser extends User {
// Userを継承する
}
一方、インターフェースは複数実装できます。たとえば、表示できることと、2行表示できることのように、複数の使い方を1つのクラスに持たせられます。
public class MultiView implements Display, TwoLineDisplay {
// DisplayとTwoLineDisplayを実装する
}
この違いも、抽象クラスとインターフェースを使い分けるときの判断材料になります。
使い分けの考え方
最初は、次のように考えると整理しやすくなります。
- 共通のフィールドや共通処理を親クラスに持たせたいなら、抽象クラス
- 違うクラスでも同じ呼び方で扱いたいなら、インターフェース
どちらを使うべきか迷ったときは、「共通の処理を持たせたいのか」「呼び方だけをそろえたいのか」を見ると判断しやすくなります。
name、printName() のように、親にまとめたい実装があるなら抽象クラスを検討します。show() のように、違うクラスを同じ使い方で呼びたいならインターフェースを検討します。確認問題
- 抽象クラスは、共通処理を持てる親クラスと、共通の呼び方を決める約束のどちらに近いですか。
- インターフェースは、共通処理を持たせることと、共通の呼び方を決めることのどちらを主な目的にしますか。
extendsとimplementsは、それぞれどのような場面で使いますか。
演習後の確認:こちらのページを使って、自分で考えた内容を見直せます。
あわせて読みたい関連記事
- Javaの抽象クラスとは?共通処理と必ず作る処理を親クラスで決める考え方
- Javaのインターフェースとは?クラスに共通の使い方を決める仕組み
- Javaのオーバーライドとは?親クラスのメソッドを子クラスで上書きする考え方
まとめ
抽象クラスは、共通処理を持てる親クラスです。インターフェースは、クラスに共通の呼び方を決める約束です。抽象クラスは extends で継承し、インターフェースは implements で実装します。最初は、共通処理を持たせたいなら抽象クラス、呼び方をそろえたいならインターフェース、と考えると違いを整理しやすくなります。