カテゴリ: JavaSilver試験対策 更新日: 2026/01/19

Javaのデフォルトメソッド完全解説!初心者が理解すべき基本ルール

043
Javaのデフォルトメソッド

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

生徒

「Javaのインタフェースにメソッドの実装を書いているコードを見たんですが、それって正しいんですか?」

先生

「いい質問ですね!インタフェースでは基本的に抽象メソッドしか定義できませんが、デフォルトメソッドという機能を使うと実装を持つことができます。詳しく見ていきましょう!」

1. デフォルトメソッドとは?

1. デフォルトメソッドとは?
1. デフォルトメソッドとは?

デフォルトメソッドは、Java 8で導入されたインタフェースの機能です。defaultキーワードを使うことで、インタフェースに実装を記述できます。これにより、実現クラスに共通の動作を提供できます。

以下はデフォルトメソッドの基本例です:


public interface Greetable {
    default void greet() {
        System.out.println("Hello, default method!");
    }
}

このようにdefaultキーワードを使えば、インタフェースに共通の処理を記述できます。

2. 実現クラスでデフォルトメソッドを使用する

2. 実現クラスでデフォルトメソッドを使用する
2. 実現クラスでデフォルトメソッドを使用する

実現クラスはデフォルトメソッドをそのまま利用できます。以下に、デフォルトメソッドを実現するクラスの例を示します:


public class Greeter implements Greetable {
    // デフォルトメソッドをオーバーライドせず、そのまま使用
}

public class Main {
    public static void main(String[] args) {
        Greetable greeter = new Greeter();
        greeter.greet(); // 出力: Hello, default method!
    }
}

このコードでは、GreeterクラスがGreetableを実現しており、デフォルトメソッドgreetをそのまま使用しています。

3. デフォルトメソッドのオーバーライド

3. デフォルトメソッドのオーバーライド
3. デフォルトメソッドのオーバーライド

実現クラスでデフォルトメソッドをオーバーライドして独自の実装を提供することも可能です。以下にその例を示します:


public class CustomGreeter implements Greetable {
    @Override
    public void greet() {
        System.out.println("Hello from CustomGreeter!");
    }
}

public class Main {
    public static void main(String[] args) {
        Greetable greeter = new CustomGreeter();
        greeter.greet(); // 出力: Hello from CustomGreeter!
    }
}

このコードでは、CustomGreeterクラスがGreetablegreetメソッドをオーバーライドしています。

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

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

※ Amazon広告リンク

4. 複数インタフェースのデフォルトメソッド

4. 複数インタフェースのデフォルトメソッド
4. 複数インタフェースのデフォルトメソッド

クラスが複数のインタフェースを実現しており、それらが同じ名前のデフォルトメソッドを持つ場合、競合が発生します。このとき、クラス側でどの実装を使うかを明示的に指定する必要があります。


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

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

public class C implements A, B {
    @Override
    public void show() {
        A.super.show(); // Aのデフォルトメソッドを呼び出す
    }
}

public class Main {
    public static void main(String[] args) {
        C obj = new C();
        obj.show(); // 出力: Default method from A
    }
}

このように、インタフェース名.super.メソッド名()で特定のデフォルトメソッドを明示的に呼び出します。

5. 試験対策ポイント

5. 試験対策ポイント
5. 試験対策ポイント
  • defaultキーワードを使ってデフォルトメソッドを定義する。
  • 複数のインタフェースのデフォルトメソッドが競合した場合、superを使って解決する。
  • デフォルトメソッドはオーバーライド可能。

まとめ

まとめ
まとめ

本記事では、Javaのデフォルトメソッド(default method)について学びました。 デフォルトメソッドを活用すると、インタフェース側に共通処理を持たせられるため、実現クラス(implementsするクラス)での重複コードを削減できます。 また、既存のインタフェースにメソッドを追加しても、実装クラスをすべて修正せずに済むケースがあり、設計の拡張に強いのが特徴です。

重要なポイントは、デフォルトメソッドは「インタフェースなのに実装を持てる」という点です。 必要に応じて実装クラス側でオーバーライドでき、さらに複数インタフェースを実現したときに同名メソッドが存在して競合した場合でも、 インタフェース名.super.メソッド名()の形で呼び出し先を明示できます。 defaultキーワードの意味を押さえておくと、Javaのインタフェース設計をより実用的に組み立てられるようになります。

検索ニーズ向けの結論
Javaのデフォルトメソッドは、インタフェースに共通処理を追加できる仕組みです。 「実装クラスの修正コストを抑えたい」「共通ロジックをまとめたい」場面で効果があり、 競合時はインタフェース名.superで解決できます。

次のサンプルコードは、デフォルトメソッドの実践的な使い方を示しています(フォーマット処理をインタフェース側に寄せ、出力側で再利用しています)。


public interface Printer {
    default void print(String message) {
        System.out.println("Printing: " + message);
    }
}

public interface Formatter {
    default String format(String message) {
        return "[Formatted] " + message;
    }
}

public class ConsolePrinter implements Printer, Formatter {
    @Override
    public void print(String message) {
        System.out.println(format(message)); // Formatterのメソッドを活用
    }
}

public class Main {
    public static void main(String[] args) {
        Printer printer = new ConsolePrinter();
        printer.print("Hello, Java!");
    }
}

実行結果:


[Formatted] Hello, Java!
押さえておきたいポイント
  • デフォルトメソッドはインタフェースに実装(処理)を持たせられる。
  • 実装クラスでは必要に応じてオーバーライドできる。
  • 同名メソッドが複数インタフェースで競合した場合は明示的に解決できる。
先生と生徒の振り返り会話

生徒

「デフォルトメソッドって、普通のクラスのメソッドみたいに感じますね。インタフェースにこんな機能があるなんて驚きました!」

先生

「そうですね。デフォルトメソッドのおかげで、インタフェースが柔軟に使えるようになりました。 特に、既存のインタフェースに新しいメソッドを追加したいときに役立ちます。 実装クラスを全部修正しないといけない状況を減らせるので、保守性の面でもメリットが大きいですよ。」

生徒

「確かに!でも、複数のインタフェースに同じ名前のメソッドがあるときの競合解決は少し複雑ですね。」

先生

「その通りです。ただ、インタフェース名.super.メソッド名()を使えば、どのメソッドを呼び出すか明確に指定できます。 “どこに共通処理を置くか”と合わせて考えると、デフォルトメソッドの使いどころが分かりやすくなります。実際に試して慣れていきましょう!」

JavaSilver試験対策の一覧へ
新着記事
FlutterのMVP・MVVMアーキテクチャの違いと使い分け
FlutterのMVP・MVVMアーキテクチャの違いと使い分けを初心者向けに解説!
オニオンアーキテクチャの基本とFlutterでの適用例
オニオンアーキテクチャの基本とFlutterでの適用例を初心者向けに解説
クリーンアーキテクチャとは?Flutterでの導入メリット
クリーンアーキテクチャとは?Flutterでの導入メリットをやさしく解説
【AWS】RDS for Oracleの特徴・できないこと・バージョン・料金まとめ
【AWS】RDS for Oracleの特徴・できないこと・バージョン・料金を初心者向けに徹底解説
人気記事
インスタンスタイプの料金比較と最適な選び方(最新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も解説

🔌 USBポート不足を解消

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

UGREEN USB-Cハブを見る

※ Amazon広告リンク