「変数宣言初期化時にfinal修飾子を付けると定数宣言になる。」という事は知られていますが、final修飾子は変数以外にもクラス、メソッドにも付けることが出来ます。
クラスに付けた場合
そのクラスは継承不可になり、継承を宣言した側でコンパイルエラーが発生します。
メソッドに付けた場合
そのメソッドはオーバーライド不可になり、サブクラス側のオーバーライド宣言時にコンパイルエラーになります。
クラスはメソッドをfinal修飾するのはクラスやメソッドを変更されないようにする場合か、十分に継承が考慮できていないために変更を禁止する場合であって、プログラミングの自由度を損なうクラス、メソッドへのfinal修飾は安易に行うべきではありません。
一方、変数にfinal修飾子を付けることは良く行われますが、いろいろなケースがあるので、それぞれ注意が要ります。
クラス変数をfinal修飾
final修飾子はメソッド内のローカル変数に指定することはもちろんですが、定数を様々なクラスで使用する場合には、一か所で定義した方が効率的であり、修正時の誤りも避けられます。そのためにはfinalに合わせてstaticをフィールドに対して修飾します。順番は順不同で構いません。
インスタンス変数をfinal修飾
インスタンス変数の参照情報は変更不可なので、一度作成したインスタンス変数に対し新たなインスタンスを代入しようとするとコンパイルエラー。しかし、既存のインスタンスのフィールド値を変更するのは可能です。
メソッド引数にfinal修飾
引数を受取った側で、引数に値を代入することが出来ません。ただし、受け取った引数がオブジェクトであればオブジェクトのフィールド値を変更することは可能です。