final クラスのインスタンス
出力はどれか。
public class Main {
public static void main(String[] args) {
Money m = new Money(100);
System.out.println(m.add(50).amount());
}
}
final class Money {
private final int amount;
Money(int amount) { this.amount = amount; }
Money add(int v) { return new Money(amount + v); }
int amount() { return amount; }
}
- A
150 - B
100 - C コンパイルエラーになる
- D 実行時に例外が発生する
正解と解説を見る
正解: A
- A: add(50) は amount を変えずに 150 を持つ新しい Money を返すので、150 が出力されます。
- B: m 自体は 100 のままですが、出力しているのは add(50) が返した新しいオブジェクトの amount です。
- C: final クラスでも普通にインスタンスを作って使えます。継承ができないだけです。
- D: 例外になる処理はありません。
ポイント
- final クラスも普通に new して使えます。継承できないだけです。
- フィールドも final にして、変更の代わりに新しいインスタンスを返すと、String のような不変クラスになります。