インターフェースの罠

インターフェースの罠

このレッスンでできるようになること。インターフェースに書ける4種類のメソッドを区別し、どれがどこから呼べるのかを言えるようになります。

いまのインターフェースには、本体を持たない抽象メソッドのほかに defaultstaticprivate のメソッドを書けます。それぞれ呼び方も実装の義務も違います。

interface Greeter { String name(); private String prefix() { return "Hi-"; } default String greet() { return prefix() + name(); } static String mark() { return "S"; } }

4種類の違い

抽象メソッドは実装クラスが必ず実装します。修飾子を省いても暗黙に public abstract なので、実装側で public を書き忘れるとアクセス修飾子を狭めたことになり、コンパイルエラーです。ここが最頻出の引っかけです。

default メソッドは本体を持ち、実装クラスはそのまま使えます。上書きしたければオーバーライドできますが、そのときも public が要ります。

static メソッドは実装クラスに継承されません。呼べるのはインターフェース名からだけで、Greeter.mark() は通りますが、実装クラス名や実装クラスのインスタンスからは呼べません。

private メソッドは default メソッドどうしの共通処理をまとめるためのもので、インターフェースの外からは見えません。

そのほかの条件

インターフェースのフィールドは暗黙に public static final です。値を入れずに宣言するとコンパイルエラーになり、あとから代入することもできません。また、同じシグネチャの default メソッドを持つ2つのインターフェースを同時に実装すると衝突してエラーになり、実装クラス側でオーバーライドして解決する必要があります。

演習では、実装クラスを2つ書いて呼び分けを確かめます。

要件

  1. 実装するメソッドには public を付ける
  2. En だけが greet() をオーバーライドする
  3. Greeter インターフェースは変更しない

入出力例

run(1)"Hi-Taro|S" run(2)"Yo-Ann|S"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.java
学習モード

メモ

インターフェースの罠

⌘S で保存