Java final修飾子メモ
Java言語において、final修飾子は使う場所によって意味合いが少し異なる使い方になります。
●定数の宣言やstaticで利用するfinalは、一度しか設定できない。つまり、一度値を設定したら変更できないという意味です。再代入を制限しているイメージです。 static final int XYZ = 100; 定数は、いちいちnewでインスタンス化しなくても使えるように、static領域というメモリ領域に取ることが普通です。なので、static finalと、2つの修飾子を続けて書くことが多いです。 メモリのstatic領域に格納するので、「クラス名.XYZ 」という記載で使えます。
●クラスの継承で利用するfinalは、このクラスを継承したサブクラス(子クラス)を作ることをできなくするという意味です。 public final class XYZ {・・・} 自分を継承した似て非なるクラスを作ることを制限するという点では似ている概念ですが、意味合いは異なります。
●オーバーライドでメソッドに付けるfinalは、継承はできるけど、そのスーパークラスのメソッドのうち、このメソッドはサブクラスの方でオーバーライド(上書き、書き換え)は禁止する(制限する)という意味です。 public final int methodXYZ() {・・・}
●メソッドの引数に付けるfinalはメソッド内では引数の値の変更が不可であることを示します。引数の値が変更されていないことが保証されます。 void methodX(final int aaa) { // finalのついた引数// Cannot assign a value to final variable 'aaa' aaa = 456; } このようにfinal修飾子は、不変性を担保すること、ひいては、不変オブジェクトをつくる(Javaの設計手法の一つ)ための手段として使うこともあります。
Discussion