1. default greet を継承した EnglishGreeter で "Java" を渡すと "Hello, Java" になる
  2. 別の名前 "Alice" でも default の連結ロジックが動く (直書きハードコードでは通らない)
  3. 空文字を渡しても default 実装の "Hello, " 部分は維持される
コース一覧
Java 中級:コレクション・Stream・例外処理
default メソッド

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

default メソッド

メソッドを 1 つ足しただけで、実装クラスが全部壊れる

interface に新しいメソッドを 1 行足すと、それを implements しているクラスがすべてコンパイルエラーになります。契約が増えたのに実装していないからです。社内の 5 クラスなら直せますが、java.util.List のように世界中で実装されている型では現実的ではありません。

それでも Java 8 は List に forEach() を足しました。既存のコードを壊さずに済ませる仕組みを、同時に入れたからです。それが default メソッドです。

default を付けると、既定の中身を一緒に配れる

interface の中で、メソッド宣言の前に default と書き、{ } で本体を書きます。

Java

interface Sensor { int read(); default String report() { return "現在値は " + read(); } }

report() は本体を持っているので、以前から Sensor を実装していたクラスは 1 文字も直さなくても そのまま通ります。read() しか書いていないクラスでも、report() が呼べるようになりました。契約は増えたのに、誰も壊れていません。

default の中では、同じ interface の他のメソッドを呼べます。上の例が read() を呼んでいるように、「子が埋めた部分を使って、共通の組み立てだけ親側でやる」書き方ができます。

気に入らないクラスだけが上書きすれば済みます。

Java

class WaterSensor implements Sensor { @Override public int read() { return 18; } @Override public String report() { return "水温 " + read() + " 度"; } }

上書きしたクラスは自分の実装が、していないクラスは default の実装が動きます。「全員に強制する」ではなく「使いたければ使える既定値を配る」という発想です。

なお default を持つ interface を 2 つ同時に implements して同じ形のメソッドがぶつかると、どちらを使うかを実装クラス側で上書きして決めることになります。

解説

interface はフィールドを持てないので、default の中で状態を覚えることはできません。引数と、同じ interface の他のメソッドから値を組み立てるだけにとどめます。

やってみよう

greetEnglish(String name) を完成させてください。

  1. interface Greeter を定義し、default String greet(String name) を実装する。受け取った名前を "Hello, " に続けて返す形にする
  2. Greeter を implements する EnglishGreeter クラスを作る。中身は空のままで構いません
  3. greetEnglish の中で EnglishGreeter のインスタンスを作り、greet(name) の結果を返す

手順 2 で何も書かないのが今回の要点です。空のクラスなのにメソッドが呼べる、という状態を自分の手で確かめてください。"Java" を渡せば "Hello, Java"、空文字なら "Hello, " が返ります。カンマの後ろの半角スペースを忘れないでください。

要件

  1. Solution の中に interface Greeter を定義し、default String greet(String name) を実装すること
  2. Greeter を implements する EnglishGreeter クラスを用意すること (中身は空でよい)
  3. greetEnglish(String name) の中で EnglishGreeter のインスタンスを生成し、greet(name) の戻り値を return すること

入出力例

greetEnglish("Java") → "Hello, Java" greetEnglish("Alice") → "Hello, Alice" greetEnglish("") → "Hello, "

ヒント

`default` メソッドの本体では `return "Hello, " + name;` のように引数を連結します。引数を使わずに `"Hello, Java"` をハードコードすると別の名前で fail します

`EnglishGreeter` は `Greeter` を `implements` するだけで、`greet` を override しなくても `default` 実装をそのまま使えます

`Solution` の中に書く場合は `static class EnglishGreeter implements Greeter {}` のように `static` を付けると、`greetEnglish` (static メソッド) から `new EnglishGreeter()` で生成できます

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • instanceof と型パターン

    Java の `instanceof` 演算子と、Java 16 以降のパターンマッチングを学び、オブジェクトの実型に応じて分岐するコードを書いてみよう。

  • ポリモーフィズムを活かす

    親クラス Shape の area() を子クラス Circle と Square がそれぞれ独自に実装し、List<Shape> にまとめて合計面積を求めるコードを書きながら、ポリモーフィズムの本質である動的ディスパッチを体感しよう。

  • 継承とポリモーフィズム まとめクイズ

    中級「継承とポリモーフィズム」章の総まとめ。`extends` / `super` / `@Override` / `abstract` / `interface` / `default` / `instanceof` / ポリモーフィズムの使い分けを 4 択で総ざらいする、コース最終クイズ。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • メソッドクラスに属する関数
  • クラスデータと振る舞いを束ねる単位
  • コンパイルソースをバイトコードへ変換する処理
  • フィールドクラスが持つデータ
  • 引数位置引数=順番で渡す。
  • インスタンスクラスから生成された実体
  • 戻り値呼び出し元への返答を表す点線矢印
main.java
学習モード
エディタを読み込んでいます

メモ

default メソッド

⌘S で保存