今日の問題に挑戦して、知識を深めましょう。
問題
以下のコードを実行したときに正しく出力される選択肢を選びなさい。
interface Creature {
void speak();
}
class Bird implements Creature {
public void speak() {
System.out.println("Chirp");
}
}
public class Main {
public static void main(String[] args) {
var myPet = new Bird();
myPet.speak();
}
}
選択肢
- A. Chirp
- B. コンパイルエラー
- C. 実行時エラー
- D. インターフェース型のメソッドが存在しないためエラー
答えと解説
回答を見る
答え
A. Chirp
解説
基本説明:
var
キーワードはJava 10から導入されたもので、コンパイラに変数の型を推論させることができます。
このコードでは、var myPet = new Bird();
と宣言することで、コンパイラはmyPet
の型をBird
として推論します。
コンストラクタで指定されている型をもとに、Javaのコンパイラが自動的に型を決めてくれるのです。
誤答理由:
誤ってコンパイルエラーや実行時エラーと考えてしまうポイントは、var
に対する理解が不十分な場合に起こります。
Javaは型安全な言語で、var
でも型安全性が保証されています。
そのため、もともとBird
型であるmyPet
は、全く問題なくspeak
メソッドを呼び出せます。
つまずきポイント:
初心者が躓く箇所としては、ローカル変数型推論を使った際に、実装されているメソッドが確実に呼ばれるか理解に自信を持てない点です。
interface
は契約のようなもので、実際の機能は実装側のクラスに委ねられます。
Bird
クラスが正しくspeak
メソッドを実装しているので、インスタンスメソッドが問題なく動作するわけです。
発展知識:
var
はローカル変数にのみ使用できます。
ファイル全体に影響を与えるフィールドやinterface
のメンバーに対しては不適用です。
さらに、var
は一度に宣言し、初期化をしなければならないという制約があります。
これは、コンパイラが静的にその型を確定するために必要なためであります。