初めまして。
私は先日JavaSE 7/8 Bronzeを取得しました。
取得したてだからこそこれから受けようとしている人に知ってもらいたい事があるので書きました。
Bronzeの内容を理解するのはそこまで難しくはないと思いますがこのテストを受けるなら問題集の問題を9割は取れるようにしたほうがいいと個人的には思います。
理由としては時間が意外と短いのでさくさく解けるようにならないと時間が足りなくなるという事と、ひっかけ問題が少々混じっているので急いでるだけで見直しをしていないと思わぬところで点を落とすからです。
なので今回は個人的にはちょっと難しいかった問題を1問紹介いたします。
問. 次のプログラムをコンパイル、実行した時の結果として正しいものを選びなさい。
public class SuperClass{
public void print(){
System.out.println("super");
}
}
public class SubClass extends SuperClass{
public void print(){
System.out.println("sub");
}
public static void main(String[] args){
SuperClass s = new SuperClass();
SubClass s2 = (SubClass) s;
s2.print();
}
}
A. 「super」と表示される
B. 「sub」 と表示される
C. コンパイルエラーになる
D. 実行時に例外がスローされる
—————-この先答え——————
答. D
参照型の型変換についての問題です。
あるクラス型の変数を実現関係や継承関係にある上位の型に変換することを「アップキャスト」と呼びます。
反対に実現関係や継承関係にある下位の型に変換することを「ダウンキャスト」と呼びます。
問題のmainメソッドではSuperClassクラスのインスタンスを生成し、まずはSuperClass型の変数で扱っています。
13行目でSuperClass型の変数を保持している参照をSubClass型にダウンキャストしていますが、
キャストを記述しているためコンパイルエラーは発生しません。
しかし実際に動作しているのはSuperClassのインスタンスであり、SubClassとしての差分を持っていないため、
実行時に例外(ClassCastException)がスローされます。
なので正解はDです。
ダウンキャストの問題は個人的には一番嫌いでした。
ダウンキャストが嫌いというよりも実行時に例外スローがわかりにくくて嫌ですよね。
Bronzeのテストでは4択問題が多いのですがその中でも「コンパイルエラー」と「実行時に例外がスローされる」の2つを見極めるのが難しいのではないでしょうか?
コンパイルエラーや実行時に例外スローに関しては自分でとにかく動かしてみて「こうなったときにコンパイルエラーになるのか。」や「コンパイルは通るけど実行時に例外スローになった。」などの経験をしてみることが一番の勉強になるのではないでしょうか。