インターフェースの罠
インターフェースの罠
このレッスンでできるようになること。インターフェースに書ける4種類のメソッドを区別し、どれがどこから呼べるのかを言えるようになります。
いまのインターフェースには、本体を持たない抽象メソッドのほかに default、static、private のメソッドを書けます。それぞれ呼び方も実装の義務も違います。
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つ書いて呼び分けを確かめます。
要件
- 実装するメソッドには
publicを付ける Enだけがgreet()をオーバーライドするGreeterインターフェースは変更しない
入出力例
run(1) → "Hi-Taro|S"
run(2) → "Yo-Ann|S"ヒント
編集 LuaGate編集部