初めて出会う「final」に戸惑った方へ
Javaを学び始めたばかりのとき、コードの中に次のような見慣れない単語を見かけることがあります。
final int number = 10;
「finalって何?」「なぜわざわざこれをつけるの?」と疑問に思う方も多いかもしれません。
ですが、finalはJavaでよく使われるキーワードで、コードを安全に、読みやすく保つための大切な役割を持っています。
この記事では、finalの意味や使い方を、プログラミングを始めたばかりの方にもわかるように、やさしく丁寧に解説します。
この記事で学べること
- finalの意味と使い方
- 変数・メソッド・クラスに使う方法
- finalを使うメリットと注意点
- どのような場面で使えばよいか
- よくある勘違いや実用的な例
finalとは?「もう変えられない」という宣言
Javaで使うfinal
は、「この変数や内容は変更しません」という宣言を示すキーワードです。
他の言語での定数を表現ですね。
final int age = 18;
このように書くと、「age」という変数には一度だけ値を入れることができます。
一度値を入れたら、あとで別の値に変えることはできません。
age = 20; // エラーになります
これは、Javaが「finalって書いてあるのに、変えようとしてるよ!」と教えてくれている状態です。
このしくみによって、うっかり間違って変えてしまうことを防げるようになっています。
finalの使い方:変数に使うのが基本
最初に覚えておきたいのは、変数への使い方です。
final String greeting = "こんにちは";
このように書くと、「greeting」という名前には「こんにちは」しか入れられなくなります。
たとえば、あとから「こんばんは」に変えようとするとエラーになります。
finalを使うことで、「これはずっと変わらない情報です」と宣言することができます。
変数についてはこちらの記事で解説しています。
どうしてfinalを使うの?
少し面倒に感じるかもしれませんが、finalを使うと次のようなメリットがあります。
- ミスを防げる
本当は変えたくなかった変数をうっかり変更してしまうことがなくなります。 - コードが読みやすくなる
finalと書かれていれば、「この値は変わらないんだな」と他の人にもすぐ伝わります。 - 設計の意図が明確になる
値を固定したままにしたい意図をコードに表せます。
finalはどんなときに使う?
初心者のうちは、次のような場面で使うのがおすすめです。
- 消費税や定価など、決めたら変えない値
final double TAX_RATE = 0.1;
- 年齢やユーザー名など、一度決めたら変更しない情報
final String USER_NAME = "Taro";
- メソッドの引数や途中で使う変数など、「うっかり変更」を防ぎたいとき
これらは、「変えなくていいものにだけfinalをつける」というシンプルな考え方でOKです。
メソッドやクラスにfinalを使うとどうなる?
ここから少し発展的なお話になりますが、Javaではメソッドやクラスにもfinalを使うことができます。
Javaでは「親クラスの機能を子クラスで書き換える(オーバーライド)」という仕組みがあります。
でも、絶対に変更してほしくない処理は、finalで守ることができます。
メソッドやオーバーライドについてはこちらの記事で解説しています。
メソッドにfinalを付ける
public final void sayHello() {
System.out.println("こんにちは");
}
このように書くと、このsayHello
メソッドは他のクラスで変更できません。
クラスにfinalを付ける
final class MathUtils {
//変数、メソッドなど
}
このようにfinalをつけたクラスは、他のクラスが継承(まねして作り直すこと)できなくなります。
「このクラスはそのまま使ってくださいね」という設計になります。
初心者のうちは、無理に覚える必要はありません。「こういう使い方もあるんだな」と思ってもらえれば十分です。
finalなのに中身が変わる?参照型には注意
次のようなコードを見て驚いたことはありませんか?
final List<String> names = new ArrayList<>();
names.add("たろう"); // これはOK
finalをつけたのに、なぜ中身が変えられるのでしょうか?
これは、「変えられない」のは変数(=ラベル)であって、オブジェクトの中身は変えられるという仕組みのためです。
names = new ArrayList<>(); // これはエラー
このように、参照型(リストや配列など)では「変数は固定されるけど、中身は変更できる」という点に注意が必要です。
もっと応用的に:ラムダ式とfinalの関係
Javaでは、ラムダ式(かんたんに書ける関数のようなもの)で変数を使うとき、その変数がfinalまたは「実質final」である必要があります。
int number = 5;
Runnable r = () -> System.out.println(number); // OK
ところが、途中で値を変えるとエラーになります。
number = 10;
Runnable r = () -> System.out.println(number); // エラー
これは「ラムダ式の中で使う値は、変わらないことが前提」というルールがあるためです。
少し難しいと感じた方は、「ラムダ式の中では変数は変えられない」と覚えておけば十分です。
まとめ
- finalは「再代入・変更を禁止する」というキーワード
- 主に変数、メソッド、クラスに使われる
- 間違った変更を防ぎ、コードの意図を明確にできる
- 参照型は中身の変更に注意が必要
- ラムダ式ではfinalまたは実質finalな変数しか使えない
Javaを学び始めたばかりのうちは、「変数にfinalをつけると一度しか値を入れられない」という基本だけをまず覚えておきましょう。
それだけでも、コードの理解や安全性がぐっと上がります。
今後さらにJavaに慣れてきたとき、メソッドやクラスへの応用や、ラムダ式での活用も自然に理解できるようになります。
まずは焦らず、一歩ずつ進んでいきましょう。