大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

Javaマスターへの道 資格勉強編 Part13

株式会社クローバーフィールドの経営理念
著者:miyauchiatsushi
公開日:2023/07/24
最終更新日:2023/07/24
カテゴリー:技術情報
タグ:

今日の問題はこちらです。
このプログラムを実行するとどうなるでしょうか

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クラスの型に変えようとしている行でコンパイルエラーとなります。
ちなみに今回のプログラムはクラスごとにファイルを分けないとその時点でコンパイルエラーとなりますので、
ご注意ください。
本日はここまでです。また次回もお楽しみに。
    上に戻る