Javaマスターへの道 資格勉強編 Part13
今日の問題はこちらです。
このプログラムを実行するとどうなるでしょうか
public class A {
public void test() {
System.out.println(“A”);
}
}
public class B extends A {
@Override
public void test() {
System.out.println(“B”);
}
}
public class C extends A {
@Override
public void test() {
System.out.println(“C”);
}
}
public class Main {
public static void main(String[] args) {
var a = new B();
a = new C();
a.test();
}
}
答えのコーナーです。
まずMainクラスからみていきましょう。
varというのは型推論と言われるもので本来変数の宣言時は型を明示的に宣言しなければいけないのですが、
このvarはコンパイル時に勝手に型を決めてくれますのでintとかString が要りません。
つまり変数aはBクラスをもとに生成したインスタンスということになります。
次に変数aをCクラスの新たなインスタンスとして代入していますね。
これが通った場合変数aの型はCクラスになるので
次のtestメソッドではCクラスのメソッドが呼び出されるはずですので、
「C」が出力されて終わりのはずですがこれは正解ではないです。
なぜならこのプログラムはコンパイルエラーを起こすからです。
どこの行か分かった方も多いのではないでしょうか、
そうですMainの4行目のCクラスを代入しようとしているところでコンパイルエラーになります。
varはどのタイミングで型を決定するかというとコンパイル時に右辺をみて決まるので、
上記の場合var a = new B();の時点でBクラスのインスタンスとして決まりこれ以降は型が変わることはありません。
なのでCクラスの型に変えようとしている行でコンパイルエラーとなります。
ちなみに今回のプログラムはクラスごとにファイルを分けないとその時点でコンパイルエラーとなりますので、
ご注意ください。
本日はここまでです。また次回もお楽しみに。