今回もJavaの基礎を振り返りながら問題を解きましょう。
問題
次のJavaコードをコンパイルし実行した場合の出力を選んでください。
interface Greetable {
void greet();
}
public class Main {
public static void main(String[] args) {
var greeter = new Greetable() {
public void greet() {
System.out.println("Hello, World!");
}
};
greeter.greet();
}
}
選択肢
- A. Hello, World!
- B. コンパイルエラー
- C. 実行時エラー
- D. 何も出力されない
答えと解説
回答を見る
答え
A. Hello, World!
解説
解説のポイント:
- 匿名クラスとインターフェース
- varの使用と型推論
基本説明
この問題では、匿名クラスというJavaの機能を使っています。
匿名クラスとは、あるインターフェースを実装する際にクラス名を指定せずに、メソッドだけをオーバーライドする方法です。
このコードでは、Greetable
というインターフェースを持ち、これを使ってgreet
メソッドを定義しています。やや独特な構文ですが、実行時には格納されたメソッドであるgreet
が呼び出され、「Hello, World!」が出力されます。
誤答理由
「コンパイルエラー」や「実行時エラー」が起こると考える人がいるかもしれません。
しかし、匿名クラスの構文が正しく書かれているため、コンパイルエラーは発生しません。
また、Javaのインターフェースは実際のメソッドの実装だけでなく、名前を変更し忘れた場合に異なるエラーが発生することがあります。それが原因とならないように注意が必要です。
つまずきポイント
この問題のつまずきポイントとして考えられるのは、匿名クラスを使ったことがない初心者はその構文に驚くかもしれません。
匿名クラスは、その場限りでクラスを即興で作りたい場合に便利です。でも、あまりにも多用するとコードの可読性が低下するため注意が必要です。
発展知識
Javaのバージョンに応じて、var
キーワードはローカル変数の型を自動的に決定してくれる素晴らしい機能です。
このコードでは、var
はGreetable
型であることを認識しています。これはJava 10以降の機能です。
さらに、ラムダ式を使えば、匿名クラスの代わりにシンプルな構文で書くことができます。これにより、コードの行数が減少し、可読性も向上します。