// インターフェイスAはデフォルトメソッドsample()を持っていて、
// "Hello"を出力する。
public interface A {
default void sample() {
System.out.println("Hello");
}
}
// インターフェイスBはAを継承しているが、新しいメソッドは追加されていない。
// したがって、Aのsample()メソッドを継承する。
public interface B extends A {
// ここでは何も追加されていない
}
// クラスCはインターフェイスBを実装しており、
// sample()メソッドをオーバーライドして"Java"を出力する。
public class C implements B {
@Override
public void sample() {
System.out.println("Java");
}
}
// Mainクラスにはプログラムのエントリーポイントであるmainメソッドが含まれる。
public class Main {
public static void main(String[] args) {
// Aのインターフェイス型である変数aに対してCのインスタンスを割り当てる。
A a = new C();
// A型の変数を通してCのインスタンスのsample()メソッドを呼び出す。
// ダイナミックバインディングにより、実際にはCのオーバーライドされた
// sample()メソッドが呼び出されるため、出力は"Java"になる。
a.sample();
}
}
このコードのmain
メソッドでは、C
のインスタンスがA
のインターフェイスタイプに割り当てられています。a.sample();
が実行されると、C
のオーバーライドされたsample()
メソッドが呼び出され、"Java"が出力されます。
選択肢Eは「上記のいずれの選択肢も適さない」と言っており、提供されたコードはすでに正しい行動をするため、AからDのいずれの修正も必要ないことを意味しています。main
メソッドで実行されるa.sample();
は正しく、他の選択肢のコードは文脈に合わないため、Eが正解となるわけです。
追記
クラス間の継承でスーパークラスのメソッドを呼び出すにはsuperを使う。
A.super.sample();
Aインスンスのsupserクラスのsampleメソッド
しかしながら、2つ以上の階層を跨いで行うことができない。
つまり、記述としてはBだが、classCで使うことはできない。
よってEが正解