1. コンストラクタで渡した "MyRunner" がそのまま name() で返る
  2. 別の名前 "Hello" でも Runnable2 型変数経由で取得できる
  3. 空文字を渡した場合も name() のシグネチャが一致していれば空文字が返る
コース一覧
Java 中級:コレクション・Stream・例外処理
interface で契約を定義

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分

interface で契約を定義

親を 1 つ選んだ時点で、もう身動きが取れない

extends できる親は 1 つだけです。ある型に「保存できる」「表示できる」「送信できる」の 3 つの役割を持たせたくても、継承では 1 つしか選べません。しかも継承は親の実装まで丸ごと引き受けるので、役割を足したいだけの用途には重すぎます。

必要なのは中身ではなく、「このメソッドを持っている」という約束だけです。それを書くのが interface です。

中身を書かず、名前と型だけ並べる

Java

interface Sensor { int read(); }

read() に本体はありません。「Sensor を名乗るなら、int を返す read() を必ず持て」という契約だけがここにあります。引き受ける側は implements と書きます。

Java

class TempSensor implements Sensor { @Override public int read() { return 23; } }

契約のメソッドは暗黙に public なので、実装側も public で書きます。private に絞ることはできません。実装を書き忘れればコンパイルエラーになるので、抜け漏れは起きません。クラスを継承するときは extends、契約を引き受けるときは implements で、ここを取り違えるとその場でエラーになります。

implements はいくつでも並べられる

extends と違い、implements はカンマ区切りで何個でも書けます。冒頭の「3 つの役割」はこう表せます。

Java

interface Storable { void save(); } interface Printable { void printInfo(); } class TempSensor implements Sensor, Storable, Printable { // 3 つぶんのメソッドをすべて実装する }

extends は 1 つ、implements は何個でも。これが両者の一番大きな違いです。実装を分けてもらうのが継承、名札を増やすのが契約、と考えると使い分けに迷いません。

観点abstract classinterface
いくつ持てるか親は 1 つだけいくつでも
フィールド普通に持てる定数だけ
向いている表現「〜の一種である」と共通実装「〜できる」という役割

Comparable Runnable AutoCloseable といった標準の型がどれも interface なのは、いずれも「〜できる」という役割だからです。

やってみよう

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

  1. interface Runnable2 を定義し、String name(); を宣言する
  2. MyRunner クラスを implements Runnable2 で作る。コンストラクタで受け取った文字列を、name() から返せるようにする
  3. runnerName の中で MyRunner を生成し、Runnable2 型の変数で受けてから name() を呼ぶ

手順 3 で MyRunner 型ではなく契約の型で受けるのが要点です。呼ぶ側が具体的なクラス名を知らなくても、契約さえ満たしていれば動く、という形をここで作っておきます。空文字を渡したときは、空文字がそのまま返ってきます。

要件

  1. interface Runnable2 を定義し、String name(); を宣言すること
  2. MyRunner クラスを implements Runnable2 で実装し、コンストラクタで受け取った文字列を name() から返すこと
  3. runnerName(String name) の中で MyRunner を生成し、必ず Runnable2 型変数で受けてから name() を呼ぶこと

入出力例

runnerName("MyRunner") → "MyRunner" runnerName("Hello") → "Hello" runnerName("") → ""

ヒント

1 ファイル内に `interface Runnable2` と `class MyRunner` の両方を書いて構いません。`public` 修飾子は付けないでください

実装メソッドは必ず `public String name()` のように `public` で書きます。`interface` のメソッドは暗黙的に `public abstract` 扱いなので、可視性は下げられません

`Runnable2 r = new MyRunner(name);` のように `interface` 型の変数で受けてから `r.name()` を呼ぶと、ポリモーフィズムの感覚もつかみやすいです

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

関連レッスン

  • default メソッド

    Java 8 で導入された interface の default メソッドの使い方と、後方互換性を保ちながら共通実装を提供する仕組みを学び、英語版あいさつメソッドを書いてみよう。

  • instanceof と型パターン

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

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

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

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

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

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

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

  • 継承親クラスの機能を子クラスへ引き継ぐ仕組み
  • メソッドクラスに属する関数
  • コンパイルソースをバイトコードへ変換する処理
  • クラスデータと振る舞いを束ねる単位
  • フィールドクラスが持つデータ
  • コンストラクタインスタンス生成時の初期化処理
  • 変数データに名前をつけて参照する仕組み
main.java
学習モード
エディタを読み込んでいます

メモ

interface で契約を定義

⌘S で保存