javaの修飾子final

javaの修飾子finalは3つのことができます。

  1. 変数の値を変更できないようにする。
  2. サブクラスによるメソッドのオーバーライドを防止する
  3. クラスを継承できなくする


一つ一つ説明していこうと思います。

変数の値を変更できないようにする

finalという修飾子を付けて宣言した変数は変更できません。一度だけ値を代入できます。
例えば

final int x = 1;
x = 2 //エラー

は怒られます。

final 変数 x に値を代入することはできません。
    x = 2;

プログラム中で使う定数とか、間違って値を変更したら困る変数にはfinalを付けて宣言すれば良いですね。


配列にfinalを付けて宣言する場合、ちょっと事情が違います。

  1 class test{
  2   public static void main(String[] args){
  3     final int[] x = {0,1,2,3,4};
  4     x[0]=100;
  5     int[] y = new int[3];
  6     x = y; //エラー
  7     System.out.println(x[0]);
  8   }
  9 }

このプログラムは4行目でエラーになりません。6行目ではエラーになります。
それは、なぜか。
finalが適用されるのは変数xの参照するアドレスだからです。
よって、4行目のように配列の要素の値を書き換えることはできます。
6行目のように参照するアドレスを変更しようとすると、エラーになります。


また、仮引数に対してもfinal宣言をすることができます。
メソッドの中ではその仮引数の値を変更できなくなります。


サブクラスによるメソッドのオーバライドを防止する

  1 class A {
  2   final void Mesod(){
  3   }
  4 }
  5 
  6 class B extends A {
  7   void Mesod(){
  8   }
  9 }

クラスAのサブクラスBによって、メソッドMesodがオーバーライドされています。
しかし、クラスAではfinal修飾子を付けてメソッドMesodが宣言されているので、このメソッドはサブクラスによってオーバーライドできません。
コンパイルすると、以下のようなエラーが出ます。

B の Mesod() は A の Mesod() をオーバーライドできません。オーバーライドされたメソッドは final です。
  void Mesod(){
       ^
エラー 1

クラスを継承できなくする

  1 final class A {
  2   void Mesod(){
  3   }
  4 }
  5 
  6 class B extends A {
  7 }

クラスBがクラスAを継承し、クラスAのサブクラスとなっています。
しかし、クラスAはfinal修飾子を付けて宣言されているので、継承されません。
コンパイルすると、以下のようなエラーになります。

final A からは継承できません。
class B extends A {
                ^
エラー 1 個


読ませていただきました。
Java Reference(final)【 Okapi Project 】
Javaの道:クラス(13.final)
http://www.ilovex.co.jp/Division/SRD/archives/2006/12/javafinal.html
Java : final class, final method - lethevert is a programmer
final属性の意味の違いについて: Javaの日々