実装クラスからインタフェースの private メソッドを呼ぶ
このコードを実行するとどうなるか。
public class Main {
public static void main(String[] args) {
System.out.println(new Daily().title());
}
}
interface Report {
private String wrap(String s) { return "[" + s + "]"; }
}
class Daily implements Report {
String title() { return wrap("daily"); }
}
- A
[daily]と出力される - B
dailyと出力される - C 実行時に例外が発生する
- D コンパイルエラーになる
正解と解説を見る
正解: D
- A: インタフェースの private メソッドは実装クラスから呼べないので、コンパイルエラーです。実行まで進まないので、何も出力されません。
- B: 実行まで進まないので、何も出力されません。
- C: コンパイルの時点でエラーになるので、実行時の例外にはなりません。
- D: wrap() は Report の private メソッドで、インタフェースの外 (実装クラス Daily) からは呼べないのでコンパイルエラーになります。
ポイント
- インタフェースの private メソッドは、そのインタフェースの中からしか呼べません。実装クラスには継承されません。
「デフォルト・メソッドとプライベート・メソッドの使用」をこのサイトで解く (記録・間違えた問題の解き直し・AI教師への質問)