カテゴリ: Javaのインターフェース 更新日: 2025/12/21

Javaのインターフェースと継承を徹底解説!複数のインターフェースを実装できる理由とは?

341
Java のインターフェースと継承(複数のインターフェースを実装できる理由)

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

生徒

「先生、Javaではクラスは1つしか継承できないって聞いたんですけど、インターフェースは複数実装できるんですか?」

先生

「その通り。Javaのクラスは単一継承ですが、インターフェースは複数同時に実装できる特徴があるんだよ。」

生徒

「どうしてインターフェースだけ複数継承できるんですか?なんだか不思議です。」

先生

「それには、Javaの安全性や柔軟性を保つ設計が関係しているよ。今日は、Javaのインターフェースと継承の関係、そして複数のインターフェースを実装できる理由をわかりやすく解説していこう。」

1. Javaの継承とは?単一継承とインターフェース

1. Javaの継承とは?単一継承とインターフェース
1. Javaの継承とは?単一継承とインターフェース

Javaでは、1つのクラスが継承できる親クラスは1つだけというルールがあります。これを単一継承と呼びます。一方、インターフェースに関しては、複数のインターフェースを同時に実装(implements)することが可能です。

この違いがJavaのクラス設計における柔軟性を生んでおり、インターフェースはクラスとは異なる役割を果たしています。

2. なぜJavaはクラスの多重継承を禁止しているのか?

2. なぜJavaはクラスの多重継承を禁止しているのか?
2. なぜJavaはクラスの多重継承を禁止しているのか?

Javaがクラスの多重継承を禁止している理由は、ダイヤモンド問題(Diamond Problem)と呼ばれる継承の曖昧さを避けるためです。複数の親クラスが同じメソッドを持っていた場合、どの親のメソッドを継承すべきかJavaが判断できなくなるためです。

この問題を回避するために、Javaはクラスの継承を1つだけに制限し、代わりにインターフェースの多重実装を認めることで、柔軟性と安全性の両立を図っています。

3. Javaで複数のインターフェースを実装する基本構文

3. Javaで複数のインターフェースを実装する基本構文
3. Javaで複数のインターフェースを実装する基本構文

Javaのクラスは、次のようにカンマ区切りで複数のインターフェースをimplementsできます。


public interface Flyable {
    void fly();
}

public interface Swimmable {
    void swim();
}

public class Duck implements Flyable, Swimmable {
    @Override
    public void fly() {
        System.out.println("空を飛ぶ");
    }

    @Override
    public void swim() {
        System.out.println("水を泳ぐ");
    }
}

空を飛ぶ
水を泳ぐ

このように、Javaでは1つのクラスが複数のインターフェースをimplementsして、それぞれのメソッドを実装することができます。

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

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

※ Amazon広告リンク

4. インターフェースは実装を持たないから安全

4. インターフェースは実装を持たないから安全
4. インターフェースは実装を持たないから安全

Javaで複数のインターフェースを同時に実装できる理由のひとつは、インターフェースが基本的にメソッドの定義しか持たないからです。

つまり、インターフェースはvoid run();のように「こういうメソッドが必要です」という契約を示すだけで、具体的な処理は一切書かれていません。そのため、クラス側でどのように実装するかは完全に自由で、衝突や曖昧さが発生しにくいのです。

5. Java 8以降のdefaultメソッドに注意

5. Java 8以降のdefaultメソッドに注意
5. Java 8以降のdefaultメソッドに注意

Java 8からは、インターフェースにdefaultメソッドが追加され、インターフェースに実装を持つメソッドを書くこともできるようになりました。


public interface Logger {
    default void log(String message) {
        System.out.println("ログ出力: " + message);
    }
}

このようなdefaultメソッドが複数のインターフェースで定義されていた場合、明示的にオーバーライドしないとエラーになることがあります。

そのため、複数のインターフェースを実装するときには、defaultメソッドの衝突にも気をつける必要があります。

6. 実践!複数インターフェースを実装するJavaコード

6. 実践!複数インターフェースを実装するJavaコード
6. 実践!複数インターフェースを実装するJavaコード

実際にJavaで複数のインターフェースを実装して、柔軟な設計を行うサンプルコードを見てみましょう。


public interface Soundable {
    void makeSound();
}

public interface Movable {
    void move();
}

public class Robot implements Soundable, Movable {
    @Override
    public void makeSound() {
        System.out.println("ビービー");
    }

    @Override
    public void move() {
        System.out.println("前進します");
    }

    public static void main(String[] args) {
        Robot robot = new Robot();
        robot.makeSound();
        robot.move();
    }
}

ビービー
前進します

このように、複数のインターフェースを実装することで、機能ごとに役割を分離した設計ができ、保守性や再利用性の高いコードになります。

7. インターフェースと多重実装の設計メリット

7. インターフェースと多重実装の設計メリット
7. インターフェースと多重実装の設計メリット

複数のインターフェースを実装できることにより、Javaでは次のような設計上の利点が得られます。

  • 役割ごとの分離がしやすくなる
  • テストや差し替えがしやすくなる(モジュール化)
  • 共通の仕様を複数クラスで共有できる
  • クラスの継承とは独立した設計ができる

特に実務では、インターフェースの多重実装によって、柔軟かつ拡張しやすいアーキテクチャを構築することが可能になります。

Javaのインターフェースの一覧へ
新着記事
Java
Java のカプセル化とは?データを安全に管理する仕組み
Java のカプセル化とは?データを安全に管理する仕組みを解説
Java
Java の継承の制約(final クラスや final メソッドの扱い)
Java の継承の制約を完全解説!final クラスや final メソッドの扱いを初心者向けにやさしく解説
AWS
【AWS】CLIで環境変数を使った安全な認証情報管理
【AWS CLI】環境変数で安全に認証情報を管理する方法を徹底解説!初心者向けセキュリティ対策ガイド
Java
Java のコンストラクタと継承(親クラスのコンストラクタを呼ぶ方法)
Java のコンストラクタと継承(親クラスのコンストラクタを呼ぶ方法)を初心者向けにやさしく解説
人気記事
AWS
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
AWS
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
AWS
インスタンスタイプの料金比較と最適な選び方(最新2026年版)
AWSインスタンスタイプの料金比較と最適な選び方!初心者でもわかる2025年最新ガイド
AWS
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説
【AWS】RDSの料金体系まとめ!ざっくり理解・高いと感じる理由も解説

🔌 USBポート不足を解消

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

UGREEN USB-Cハブを見る

※ Amazon広告リンク