本文へスキップ
BecomeCoder

Javaオブジェクト指向コース · 第5章 抽象クラスとインタフェース ― 型で「約束」する · レッスン19

defaultメソッド ― インタフェースに実装を持たせる

ブラウザで完結

導入

インタフェースのメソッドは基本的に「約束」だけで中身がありません。でも「実装するクラスすべてに共通する処理」があるなら、インタフェース自身に実装を持たせたいこともあります。そのための仕組みが default メソッド です。

説明

default をつけたメソッドは、インタフェースの中に中身(実装)を書けます。実装クラス側でオーバーライドしなくても、そのまま使えます。

public class Main {
    public static void main(String[] args) {
        Greeter g = new EnglishGreeter();
        System.out.println(g.greet());
        System.out.println(g.hello());
    }
}

interface Greeter {
    String greet();

    default String hello() {
        return "Hello, " + greet();
    }
}

class EnglishGreeter implements Greeter {
    @Override
    public String greet() {
        return "World";
    }
}
  • greet() … 実装クラスに中身を委ねる、通常の(中身のない)インタフェースメソッド。
  • default String hello() { return "Hello, " + greet(); } … インタフェース自身が実装を持つメソッド。中で greet() を呼んでいますが、これは 実際に実装したクラスの greet() が呼ばれます(動的束縛と同じ考え方です)。EnglishGreeterhello() を自分で書いていませんが、そのまま使えます。

やってみよう

下のエディタで別の Greeter 実装クラスを追加し、hello() を自分で書かなくても正しく動くことを確認しましょう。

演習

greet()"世界" を返す JapaneseGreeter implements Greeter を作ってください。hello() はオーバーライドせず、デフォルトのまま使ってください。mainGreeter g = new JapaneseGreeter(); として g.hello() を表示してください。

ヒント1を見る

class JapaneseGreeter implements Greeter { @Override public String greet() { return "世界"; } }hello() は書きません。

ヒント2を見る

mainGreeter g = new JapaneseGreeter(); System.out.println(g.hello());

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。