Java
1class Enginner extends Empolyee implements Worker {
2}
「Empolyee」は誤記で、Employee ですね
Enginner も 「Engineer」の綴りミスでしょうが、これはmainメソッド内も同じなのでプログラム上は問題なし。
以下Employee、Engineer として記載しています。
この設問、私が所有しているものと同じ書籍であれば、回答は以下の4択です。
A.Engineerクラスでコンパイルエラーが発生する
B.Mainクラスでコンパイルエラーが発生する
C.「work」と表示される
D.実行時に例外がスローされる
一見インターフェースに定義された抽象メソッドを、実装クラスでオーバーライドしているようには見えません。
コンパイルエラーになるかも、でもそうはならないよ、というタイプの問題かと思います。
スーパークラスの型でサブクラスのインスタンスを生成した際、
スーパークラスに定義したメソッドは、サブクラスでオーバーライドしていなければ
スーパークラスのメソッドを使う。
同様に、この設問の場合
インスタンスの型はWorkerインターフェース。
Workerインターフェースには、work()メソッドが定義されている。
Engineerクラスにはwork()メソッドの定義がなくオーバーライドしていない。
なのでWorkerで定義したwork()メソッドが実行される」
と、質問者さんは考えたのではないかと想像します。
抑えておくべき点は以下です。
- 抽象メソッドはそのままでは実行できない(実行するものではない)。
- 抽象メソッドをもったインターフェースを実装する場合、抽象メソッドをオーバーライドし実装しなければいけない。実装しないとコンパイルエラー。
- メソッドを実行するには、実装クラスのインスタンスを生成し実行する
- インターフェース型で実装クラスのインスタンスを生成した場合に使用できるのは
- インターフェースの抽象メソッドを実装クラスでオーバーライドしているメソッド
- インターフェースのデフォルトメソッド
そもそも、これらの点がわかっていないとすれば、恐らくお持ちであろう問題集の黒本ではなく、しっかりとした入門書(若しくは、試験特化で記載が十分とは思えませんが紫本)をまず読んだほうがいいです。
これを踏まえた上で、設問では
・Workerインターフェース型で実装クラスであるEngineerクラスのインスタンスを生成している。
・そのインスタンスのwork()メソッドを実行しようとしている。
・Workerインターフェースにwork()メソッドが抽象メソッドとして定義されている
・実行できるのは実装されたwork()メソッドだが、明示的なwork()メソッドの実装はEngineerクラスにはない
・一方、Employeeクラスには同じシグネチャのwork()メソッドがある
・Engineerクラスは Employeeクラスを継承しているので、このwork()メソッド定義を内包している
・結果、間接的にWorkerインターフェースの抽象メソッドwork()をEngineerクラスで実装していることになりコンパイルエラーは起こらない。且つ、実行することができる
Workerインターフェースのwork()メソッドそのものでなく、あくまでEngineerクラスでオーバーライドしたwork()メソッドを実行している。
そして、その実装内容はEmployeeクラスから継承されたwork()メソッド、ということです。