【Java】final変数の基本をやさしく解説|値を変えられない仕組みと実務での使いどころ

Java入門・実践
スポンサーリンク
スポンサーリンク

はじめに

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"); // OK

final は“参照先を変えられない”だけで、中身は自由に変更できます。

イメージ:

  • 「この箱を使い続けてね」と言われているだけ
  • 箱の中身を入れ替えるのは自由

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
decopon

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

moco
moco

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

コメント

タイトルとURLをコピーしました