finalキーワードは、「一度設定したら変更できない」という制約を、変数、メソッド、クラスの3つの要素に課すために使われます。これは、プログラムの安全性を高め、意図しない変更を防ぐ上で非常に重要です。
1. finalな変数:定数 (Constant)
finalを付けた変数は、初期化された後は値の再代入が禁止されます。これにより、その変数は「定数」として扱われます。
特徴
- フィールドの場合: 通常、定数として扱う
finalフィールドは、staticと組み合わせ、すべて大文字のスネークケースで命名するのがJavaの慣習です。 - ローカル変数の場合: メソッド内で宣言される
finalな変数は、一度値を代入したら変更できません。
Java
public class Constants {
// 完全に固定された定数 (どこからでもアクセス可能)
public static final double PI = 3.14159;
public static final int MAX_USERS = 100;
public void example() {
final int LIMIT = 50;
// LIMIT = 60; // コンパイルエラー!再代入禁止
}
}
2. finalなメソッド:オーバーライドの禁止
メソッドにfinalを付けると、子クラスでのオーバーライド(上書き)が禁止されます。
用途
- 重要なロジックの保護: 非常に重要な計算ロジックやセキュリティに関わる処理など、子クラスに変更されたくないメソッドに対して使用します。
- パフォーマンスの向上: (JVMの最適化によるものですが)
finalメソッドは、コンパイラがそのメソッドの処理内容が変更されないと確定できるため、わずかに実行速度が向上する場合があります。
Java
class Parent {
public final void printIdentity() {
System.out.println("親クラスの重要なIDを印刷します。この処理は変更できません。");
}
}
class Child extends Parent {
// public void printIdentity() {} // コンパイルエラー!finalメソッドはオーバーライド不可
}
3. finalなクラス:継承の禁止
クラス宣言にfinalを付けると、そのクラスを継承した子クラスを作成することが禁止されます。
用途
- 完全な設計: そのクラスが「最終的な形」であり、これ以上機能を拡張・変更されたくない場合に指定します。
- セキュリティ: クラスの振る舞いを固定し、悪意のある変更や予期せぬ拡張を防ぎます。
- Java標準クラス:
StringクラスやSystemクラスなど、Java標準ライブラリの多くの重要なクラスはfinalに設定されています。
Java
// 誰もこのクラスを継承できない
public final class UtilityHelper {
public static String formatName(String name) {
return name.toUpperCase();
}
}
// class ExtendedHelper extends UtilityHelper {} // コンパイルエラー!finalクラスは継承不可
finalキーワードは、プログラムの信頼性とメンテナンス性を高める上で、オブジェクト指向設計の基盤として非常に重要な役割を果たします。

