こんにちは。
ゴールデンウィークも明けてさらに気温が暑くなってきましたね。
今日は初歩的だけど大切なインスタンスフィールドの初期化に関する問題です。
問.次のコードをコンパイル、実行したときの結果として正しいものを選びなさい。(1つ選択)
public class Bridge{
String name;
public static void main(String[] args){
Bridge b = new Bridge();
if(b.name == "")
b.name = "Brooklyn";
System.out.println(b.name);
}
}
A.何も表示されない
B.「null」と表示される
C.「Brooklyn」と表示される
D.コンパイルエラーになる
E.実行時に例外が発生する
————-この先答え——————–
答.B
インスタンスフィールドの初期化に関する問題です。
インスタンスフィールドは初期化処理を記述しないと、次のデフォルト値で暗黙的に初期化されます。
【デフォルト値】
プリミティブ型 | プリミティブ型 | プリミティブ型 | プリミティブ型 | 参照型 |
---|---|---|---|---|
整数値 | 浮動小数点数型 | 文字型 | 真偽値型 | |
0 | 0.0 | ¥u0000 | false | null |
設問コードの2行目ではインスタンスフィールドnameを宣言していますが、
初期化処理を記述していません。したがって、デフォルト値で初期化されます。
フィールドnameの型はString型です。Stringは参照型の一種であるため、nullで初期化されます。
7行目の条件式はフィールドnameの参照先と空文字列「””」を持つStringインスタンスが同じ参照先にあるかどうかを比較しています。
同じ内容の文字列を持っているかどうかを比較しているわけではないことに注意。
フィールドnameの値はnullであり、どこにも参照されません。
そのため条件式の結果はfalseになり、8行目は実行されません。
その後if文を抜けてインスタンスフィールドnameの内容をコンソールに出力します。
したがって選択肢Bが正解です。
「初期化処理を行わないとデフォルト値で暗黙的に初期化される」
この点を忘れずにいれば問題ないですね。
後は空文字とnullは全くの別物です。
nullには全くなにも含まれていないのです。無なのです。