final な参照が指すオブジェクト
このコードを実行するとどうなるか。
public class Main {
public static void main(String[] args) {
final StringBuilder sb = new StringBuilder("a");
sb.append("b");
System.out.println(sb);
}
}
- A
abと出力される - B
aと出力される - C 実行時に例外が発生する
- D コンパイルエラーになる
正解と解説を見る
正解: A
- A: final なのは変数 sb (参照先を変えられない) だけで、オブジェクトの中身は変えられます。append で ab になります。
- B: sb.append("b") で同じオブジェクトの中身が変わるので、a のままではありません。
- C: 例外になる処理はありません。
- D: sb に再代入していないので、final 変数でもコンパイルできます。
ポイント
- final なのは 変数 (参照) で、別のオブジェクトを代入できなくなるだけです。指しているオブジェクトの中身は変えられます。