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

Javaのdefaultメソッドの使い方を解説!初心者でもわかるインターフェースの進化ポイント

342
Java のデフォルトメソッド(default メソッド)の使い方

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

生徒

「先生、Javaのインターフェースにdefaultメソッドっていうのがあるって聞いたんですけど、どういうものなんですか?」

先生

「良いところに気づいたね。Java 8から導入されたdefaultメソッドは、インターフェースにも実装付きのメソッドが書けるようにする新しい仕組みなんだよ。」

生徒

「でも、インターフェースって本来は実装を持たない設計じゃなかったんですか?」

先生

「そう、それが基本だったけど、Javaの進化によってdefaultメソッドが追加されて、もっと柔軟に設計できるようになったんだ。それじゃ、使い方と注意点を一緒に見ていこう!」

1. defaultメソッドとは?

1. defaultメソッドとは?
1. defaultメソッドとは?

Javaのdefaultメソッドとは、インターフェースの中に具体的な処理内容を持ったメソッドを定義できる機能です。Java 8で導入され、既存のインターフェースに後からメソッドを追加しても、実装クラス側の互換性を保つために設計されました。

通常、インターフェースはabstractなメソッドしか持てませんでしたが、defaultキーワードを使うことで、中身のあるメソッドを書くことが可能になりました。

2. Javaでのdefaultメソッドの基本的な書き方

2. Javaでのdefaultメソッドの基本的な書き方
2. Javaでのdefaultメソッドの基本的な書き方

Javaのdefaultメソッドは、次のようにdefaultキーワードを使って定義します。


public interface Greeting {
    default void sayHello() {
        System.out.println("こんにちは!");
    }
}

このように書くことで、Greetingインターフェースを実装するすべてのクラスでsayHello()メソッドがそのまま利用可能になります。

3. 実装クラスでdefaultメソッドを使う例

3. 実装クラスでdefaultメソッドを使う例
3. 実装クラスでdefaultメソッドを使う例

インターフェースのdefaultメソッドを実装クラスでそのまま使う、またはオーバーライドするサンプルを見てみましょう。


public interface Greeting {
    default void sayHello() {
        System.out.println("こんにちは!");
    }
}

public class JapaneseGreeting implements Greeting {
    // オーバーライドしない場合は、GreetingのsayHello()がそのまま使われる
}

public class EnglishGreeting implements Greeting {
    @Override
    public void sayHello() {
        System.out.println("Hello!");
    }
}

こんにちは!
Hello!

JapaneseGreetingではsayHello()をそのまま使用しており、EnglishGreetingでは独自にオーバーライドしています。このように、defaultメソッドは柔軟に扱うことができます。

4. 複数インターフェースとdefaultメソッドの衝突

4. 複数インターフェースとdefaultメソッドの衝突
4. 複数インターフェースとdefaultメソッドの衝突

Javaでは、複数のインターフェースを同時にimplementsすることが可能ですが、同名のdefaultメソッドが複数あるとコンパイルエラーになります。


public interface A {
    default void show() {
        System.out.println("Aのshow");
    }
}

public interface B {
    default void show() {
        System.out.println("Bのshow");
    }
}

public class MyClass implements A, B {
    @Override
    public void show() {
        A.super.show(); // または B.super.show()
    }
}

このような場合、クラス側でどちらのメソッドを使うのかをインターフェース名.super.メソッド名で明示する必要があります。

5. defaultメソッドの使い道とメリット

5. defaultメソッドの使い道とメリット
5. defaultメソッドの使い道とメリット

Javaのdefaultメソッドは、以下のような場面で役立ちます。

  • 既存のインターフェースに機能追加したいとき
  • 共通的な処理をインターフェース側で提供したいとき
  • 実装クラスの負担を減らしたいとき

たとえば、ログ出力やバリデーション処理など、複数のクラスで共通して使う処理をdefaultメソッドにしておけば、コードの重複を減らせます。

6. defaultメソッドと抽象メソッドの違い

6. defaultメソッドと抽象メソッドの違い
6. defaultメソッドと抽象メソッドの違い

defaultメソッドとabstractメソッドの違いをしっかり理解しておきましょう。

  • defaultメソッド:インターフェース内に処理を書ける。オーバーライドは任意。
  • abstractメソッド:実装クラスで必ずオーバーライドが必要。処理は書けない。

この違いを理解すると、インターフェースをより柔軟に設計できるようになります。

7. staticメソッドとの違いにも注意

7. staticメソッドとの違いにも注意
7. staticメソッドとの違いにも注意

Javaのインターフェースにはstaticメソッドも定義できます。defaultメソッドとの主な違いは、呼び出し方です。


public interface Util {
    static void printInfo() {
        System.out.println("情報表示");
    }
}

Util.printInfo()のように、クラス名から直接呼び出します。一方、defaultメソッドは実装クラスのインスタンス経由で呼び出します。

Javaのインターフェースの一覧へ
新着記事
Java で正規表現を使う方法(Pattern クラスと Matcher クラス)
Javaで正規表現を使う方法を完全解説!PatternクラスとMatcherクラスを初心者向けにやさしく説明
FlutterでQRコードの生成・読み取りをする方法
FlutterでQRコードの生成・読み取りを実装する方法!初心者でもできるQRアプリ開発
Flutterでプッシュ通知を実装する方法!Firebase活用ガイド
Flutterでプッシュ通知を実装する方法!Firebase活用ガイド【初心者向け完全解説】
Flutterでアプリを作る流れをやさしくステップ解説
Flutterでアプリを作る流れをやさしくステップ解説!初心者でも安心スタートガイド
人気記事
インスタンスタイプの料金比較と最適な選び方(最新2025年版)
AWSのインスタンスタイプの料金比較と最適な選び方【2025年最新版】
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説