はじめに
Java を学び始めるとよく見かけるキーワード
「final」。
「値を変えられないやつでしょ?」
というイメージは合っているのですが、
実は プリミティブ型と参照型で意味が少し違う ため、
最初は混乱しがちなポイントです。
この記事では、やさしく・実務寄りに final
変数の基本を整理していきます。
まずはコードを確認
Java
final int a = 10;
// a = 20; // エラー(再代入不可)
final String s = "hello";
// s = "world"; // エラー(再代入不可)
final List<String> list = new ArrayList<>();
list.add("A"); // OK(中身は変更できる)コードのしくみを解説
final は「再代入できない」という意味
最も大事なポイントはこれ。
final = 変数に“別の値”を入れ直せない
プリミティブ型なら「値そのもの」が変えられません。
Java
final int a = 10;
a = 20; // エラー参照型なら「参照先(住所)」が変えられません。
Java
final String s = "hello";
s = "world"; // エラー参照型の final は「中身は変えられる」
ここが初心者がつまずくポイント。
Java
final List<String> list = new ArrayList<>();
list.add("A"); // OK
list.add("B"); // OKfinal は“参照先を変えられない”だけで、中身は自由に変更できます。
イメージ:
- 「この箱を使い続けてね」と言われているだけ
- 箱の中身を入れ替えるのは自由
final 変数は「一度だけ代入できる」
final 変数は、宣言と同時でなくても OK。
Java
final int x;
x = 10; // 初回代入はOK
// x = 20; // 2回目はNGコンストラクタで初期化するパターンもよくあります。
あわせて知っておきたいポイント
定数として使う場合は「static final」
Java
static final int MAX_COUNT = 100;- 変更不可
- クラス全体で共有
- 大文字スネークケースが慣習
実務では設定値や固定値に使われます。
final は「意図を伝える」ためにも使われる
- 「この値は変えません」
- 「この参照は固定です」
という意思表示になるため、 コードの可読性が上がります。
メソッドやクラスにも final は使える
今回は変数がテーマですが、補足として:
- final メソッド:オーバーライド禁止
- final クラス:継承禁止(例:String)
Java Bronze の試験では軽く触れられることがあります。
使うときに気をつけたいこと
- final は“再代入不可”であって“中身が不変”ではない
- 参照型の final は中身が変わるので誤解しない
- 定数は static final で宣言する
- final を使うと意図が明確になり、バグを防ぎやすい
特に参照型の final は誤解されやすく、
「final なのに値が変わってる!」という相談は実務でもよくあります。
まとめ
final の基本
- 一度代入したら再代入できない
- プリミティブ型:値が変わらない
- 参照型:参照先が変わらない(中身は変わる)
よく使う場面
- 定数(static final)
- 値を固定したい変数
- 意図を明確にしたいとき

decopon
final はシンプルに見えて、 「参照型の中身は変わる」という点でつまずきやすいテーマです。
ここを理解しておくだけで、 Java Bronze の問題も、実務のコードレビューも ぐっと読みやすくなります。
あなたの学びが、次のステップにつながりますように。

moco
final は「この箱をずっと使うよ」っていう約束なんだって。
箱の中身は自由に入れ替えられるんだよ。

コメント