カテゴリ: Javaの抽象クラス 更新日: 2026/04/25

Javaの抽象クラスとインターフェースの違いとは?初心者でもわかる使い分けのポイント

331
Java の抽象クラスとインターフェースの違いとは?

先生と生徒の会話形式で理解しよう

生徒

「Javaで抽象クラスとインターフェースって何が違うんですか?」

先生

「どちらも共通の機能を定義するために使うんですが、それぞれ使い方や目的が違うんですよ。」

生徒

「使い分けが難しそうです…。どうすればいいですか?」

先生

「それでは、Javaの抽象クラスとインターフェースの違いや使い方について、わかりやすく解説していきましょう。」

1. 抽象クラスとは?

1. 抽象クラスとは?
1. 抽象クラスとは?

Javaの抽象クラス(abstract class)は、共通の処理や構造を持たせながら、詳細な実装はサブクラスに任せたいときに使います。抽象クラスは、abstractというキーワードを使って定義し、抽象メソッド(処理を持たないメソッド)や通常のメソッド(処理を含むメソッド)を含むことができます。

つまり、ある程度の共通処理を持たせつつ、派生クラスで自由にカスタマイズできるのが特徴です。

2. インターフェースとは?

2. インターフェースとは?
2. インターフェースとは?

Javaのインターフェース(interface)は、「こういう機能を持つべき」という契約のようなもので、実際の処理は持たず、メソッドの定義だけを記述します。クラスはこのインターフェースをimplementsして、すべてのメソッドを実装する必要があります。

ただし、Java 8以降ではdefaultstaticメソッドを使うことで、インターフェースでも一部の実装を持つことができるようになりました。

3. 抽象クラスとインターフェースのコードでの違い

3. 抽象クラスとインターフェースのコードでの違い
3. 抽象クラスとインターフェースのコードでの違い

それでは、実際にJavaコードで違いを見てみましょう。まずは抽象クラスからです。


abstract class Animal {
    public abstract void makeSound();

    public void sleep() {
        System.out.println("動物が眠っています...");
    }
}

class Dog extends Animal {
    public void makeSound() {
        System.out.println("ワンワン!");
    }
}

次に、インターフェースの例です。


interface AnimalInterface {
    void makeSound();
}

class Cat implements AnimalInterface {
    public void makeSound() {
        System.out.println("ニャーニャー!");
    }
}

インターフェースは複数のインターフェースを同時にimplementsできますが、抽象クラスはextendsで1つしか継承できません。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

4. 機能と特徴の比較表

4. 機能と特徴の比較表
4. 機能と特徴の比較表

抽象クラスとインターフェースの違いを整理した表を確認しましょう。

項目 抽象クラス インターフェース
キーワード abstract class interface
継承の制限 1つのみ 複数可能
通常メソッド 定義可能 defaultstaticで一部可能
フィールド 状態(変数)を持てる 定数(public static final)のみ
コンストラクタ あり なし

5. 抽象クラスとインターフェースの使い分け方

5. 抽象クラスとインターフェースの使い分け方
5. 抽象クラスとインターフェースの使い分け方

Javaで抽象クラスとインターフェースを使い分ける基準は、以下のように考えるとシンプルです。

  • 共通処理を持たせたい → 抽象クラス
  • 契約だけを定義したい(処理は各クラスに任せたい) → インターフェース
  • すでに別のクラスを継承していて多重継承が必要 → インターフェース
  • 状態(フィールド)を持たせたい → 抽象クラス

たとえば、図形を描画するプログラムでは、共通のプロパティや一部の動作を抽象クラスで定義し、それぞれの図形(円、四角など)の具体的な処理をサブクラスで実装するという形が考えられます。

6. Javaのバージョンによる違いと注意点

6. Javaのバージョンによる違いと注意点
6. Javaのバージョンによる違いと注意点

Java 8以降では、インターフェースでもdefaultメソッドを使うことで、処理を定義できるようになりました。ただし、この機能はあくまで補助的なものであり、共通処理を多く持たせたい場合はやはり抽象クラスのほうが向いています。

また、インターフェースに実装を書く場合は、defaultを忘れずにつける必要があります。付けないと抽象メソッド扱いになってしまい、全クラスで実装が求められます。

7. 抽象クラスとインターフェースを併用することも可能

7. 抽象クラスとインターフェースを併用することも可能
7. 抽象クラスとインターフェースを併用することも可能

Javaでは、抽象クラスを継承しつつ、インターフェースを複数実装するということも可能です。


abstract class Animal {
    public void sleep() {
        System.out.println("動物が寝ています");
    }
}

interface Runnable {
    void run();
}

class Dog extends Animal implements Runnable {
    public void run() {
        System.out.println("走っています!");
    }
}

このようにすることで、共通処理を抽象クラスから継承しながら、動作に関する契約(インターフェース)も併用できます。

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

Javaの抽象クラスとインターフェースの決定的な違いは何ですか?初心者がまず覚えるべきポイントを教えてください。

Javaの抽象クラスとインターフェースの最大の違いは、その「目的」と「継承のルール」にあります。抽象クラス(abstract class)は、複数のクラスで共有したい具体的な処理や「状態(変数・フィールド)」を持たせることができる「設計のベース」です。一方でインターフェース(interface)は、「そのクラスがどのような振る舞い(メソッド)を持つべきか」という「契約(ルール)」を定義するものです。また、Javaの文法上の大きな違いとして、抽象クラスは1つしか継承(extends)できませんが、インターフェースは1つのクラスに対して複数を実装(implements)することが可能です。初心者のうちは、共通の性質を持つグループを作りたいなら抽象クラス、特定の能力や機能を外付けしたいならインターフェース、と覚えると分かりやすいでしょう。
Javaの抽象クラスの一覧へ
新着記事
Flutter
Flutterでのリポジトリパターンの実装例
Flutterでリポジトリパターンを実装する方法を完全解説!初心者向けアーキテクチャ設計入門
Java
Java の Objects クラスを使って null チェックを簡単にする方法
JavaのObjectsクラスの使い方を完全ガイド!nullチェックを簡単・安全に行う方法
Java
Java の UUID クラスを使って一意の識別子を作成する方法
JavaのUUIDクラスの使い方を完全ガイド!初心者でもわかる一意な識別子の作成方法
Java
Java の古い日付クラス(Date, Calendar)と新しい日付 API の違い
JavaのDateとCalendarと新しい日付APIの違いとは?初心者向け完全ガイド
人気記事
Java
Java の Random クラスを使ってランダムな数値を生成する方法
JavaのRandomクラスの使い方を完全ガイド!初心者でもわかる乱数生成
Java
Java の getter メソッドと setter メソッドの使い方
Javaのgetterメソッドとsetterメソッドの使い方を完全ガイド!初心者でもわかるアクセス方法
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
AWS
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説
【AWS】VPCとは?初心者向けに仕組み・用途・できることをわかりやすく解説

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク