javaの修飾子final
javaの修飾子finalは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の日々