プリミティブ型と参照型でのfinalの違い

Javaの変数にはプリミティブ型と参照型の2種類がある。
一応確認しておくと
プリミティブ型は
byte,short,int,logn,float,double,boolean,char

参照型は
それ以外
class宣言で作成される
Objectクラスを継承したものはすべてである。

これらの違いは
プリミティブ型は
変数用に確保されたメモリ領域に直接値が書き込まれる。

参照型は
インスタンスが生成された際にメモリに領域が確保されるが、
変数用に確保された領域にはインスタンス用に確保されたメモリの
アドレスが格納されている。

この違いは
メソッドに渡した引数の値を書き換えてみるとわかる。

さて、問題のfinal宣言時の違いだが、
finalによって定数化されるは
変数用のメモリ領域である。

なので
プリミティブ型の変数をfinalにした場合は
値を書き換えることができないが、
参照型の場合、変数に別なインスタンスを入れることが
できないだけで、インスタンスの内部で扱っているものを
書き換えることはできるのである。

参照型の場合、finalになっていても
値が書き変わっていることがある。要注意。