導入
インタフェースのメソッドは基本的に「約束」だけで中身がありません。でも「実装するクラスすべてに共通する処理」があるなら、インタフェース自身に実装を持たせたいこともあります。そのための仕組みが 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()が呼ばれます(動的束縛と同じ考え方です)。EnglishGreeterはhello()を自分で書いていませんが、そのまま使えます。
やってみよう
下のエディタで別の Greeter 実装クラスを追加し、hello() を自分で書かなくても正しく動くことを確認しましょう。
演習
greet() で "世界" を返す JapaneseGreeter implements Greeter を作ってください。hello() はオーバーライドせず、デフォルトのまま使ってください。main で Greeter g = new JapaneseGreeter(); として g.hello() を表示してください。
ヒント1を見る
class JapaneseGreeter implements Greeter { @Override public String greet() { return "世界"; } }。hello() は書きません。
ヒント2を見る
main で Greeter g = new JapaneseGreeter(); System.out.println(g.hello());。