7章6

TANIAOKA, Akihiro - Apr 8 - - Dev Community
// インターフェイス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();
    }
}
Enter fullscreen mode Exit fullscreen mode

このコードの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が正解

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .