このJavaのコードは、インタフェースと継承の概念を使用しています。ポイントは以下の通りです:
Workerという名前のインターフェイスがあり、これはworkという抽象メソッドを持っています。インターフェイスは、具体的な実装を持たないメソッドの宣言を提供する契約のようなものです。Employeeというクラスがあり、このクラスはworkメソッドを実装しており、"work" と出力するようになっています。Engineerというクラスがあり、Employeeクラスを継承し(extends)、Workerインターフェイスを実装しています(implements)。EngineerはEmployeeからworkメソッドの実装を継承します。Mainクラスのmainメソッドでは、Worker型の変数workerが宣言され、新しく作成されたEngineerオブジェクトが代入されています。worker.work();という行で、worker変数に割り当てられたオブジェクトのworkメソッドが呼び出されます。workerはWorker型ですが、実際にはEngineerインスタンスが参照されているため、Employeeクラスによって提供されるworkメソッドの実装が実行されます。つまり、コンソールには "work" が出力されます。
問題の選択肢を見ると、以下の通りです:
A. Engineerクラスでコンパイルエラーが発生する
B. Mainクラスでコンパイルエラーが発生する
C. "work" と表示される
D. 実行時に例外がスローされる
このコードを分析すると、コンパイルエラーや実行時例外は発生しないため、AとBとDは不正確です。Engineer オブジェクトを通じて work メソッドが呼び出されると "work" がコンソールに出力されるので、答えは C です。
// Workerというインターフェイスを定義します。
// これは、実装するすべてのクラスに対して、workというメソッドの実装を強制します。
interface Worker {
void work(); // workメソッドのシグネチャ。実装は提供されていません。
}
// Employeeクラスを定義します。
// このクラスは、workメソッドを持っており、何か作業をすることを示すメッセージを出力します。
class Employee {
public void work() { // workメソッドを実装します。
System.out.println("work"); // コンソールに"work"と出力します。
}
}
// Engineerクラスを定義します。
// このクラスはEmployeeクラスを継承し(extends)、
// Workerインターフェイスを実装します(implements)。
// ただし、EngineerはEmployeeからworkメソッドを継承するので、
// 明示的なメソッド実装を提供する必要はありません。
class Engineer extends Employee implements Worker {
// ここでは何も追加しなくても、Employeeクラスからworkメソッドを継承します。
}
// Mainクラスを定義します。
public class Main {
public static void main(String[] args) {
// Workerインターフェイスを実装するEngineerオブジェクトを作成し、
// Worker型の変数workerに割り当てます。
Worker worker = new Engineer();
// workerのworkメソッドを呼び出します。
// 実際にはEngineer(Employeeから継承した)のworkメソッドが実行され、
// "work"とコンソールに出力されます。
worker.work();
}
}
このコードは、オブジェクト指向プログラミングのポリモーフィズムを示しています。Worker インターフェイスの参照を通して、Employee クラスの work メソッドを呼び出すことができます。これは、Engineer オブジェクトが Worker インターフェイスの work メソッド契約を満たすためです。これにより、プログラムはより柔軟で、拡張性が高くなります。
Top comments (0)