カテゴリ: 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のインターフェースの一覧へ
新着記事
Flutterアプリの署名設定(Android・iOSのポイント)
Flutterアプリの署名設定を完全解説!Android・iOSのビルドとデプロイ初心者ガイド
Java のインターフェースとは?普通のクラスとの違いを学ぼう
Javaのインターフェースとは?普通のクラスとの違いを学ぼう【初心者向け解説】
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
EC2の料金体系を完全解説!オンデマンド・リザーブド・無料枠の違いとは?
EC2の料金体系を完全解説!オンデマンド・リザーブド・無料枠の違いとは?
人気記事
インスタンスタイプの料金比較と最適な選び方(最新2025年版)
AWSのインスタンスタイプの料金比較と最適な選び方【2025年最新版】
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説

🔌 USBポート不足を解消

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

UGREEN USB-Cハブを見る

※ Amazon広告リンク