次のステートメントの違いは何ですか
String name = "Tiger";
final String name ="Tiger";
String
クラスはクラスですがfinal
、なぜ文字列「CONSTANT」変数をfinalとして作成する必要があるのでしょうか。
final
このコンテキストでは、変数name
は1回しか割り当てることができないことを意味します。別のオブジェクトを再度割り当てるString
と、コンパイルエラーが発生します。
final
ここでの混乱の原因は、キーワードがいくつかの異なるコンテキストで使用できることだと思います。
それぞれの場合の例については、Javaでのfinalに関するウィキペディアの記事を参照してください。
「最終」は、2 つの場合で異なるものを意味します。
java.lang.String クラスは final です。これは、それを継承できないことを意味します。
変数 "name" は final です。つまり、String の別のインスタンスを指すように変更することはできません。したがって、非 final String 変数は定数ではありません。これは、2 つの異なる時点で読み取り、異なる値を取得できるためです。
たまたま、Java 文字列オブジェクトも不変です。これは、特定の String オブジェクトが表す値を変更できないことを意味します。これを配列と比較してください。配列オブジェクトの最初の要素を別のオブジェクトに置き換えることはできますが、String オブジェクトの最初の文字を別の文字に置き換えることはできません。これが、 String.replace() が新しい文字列を返す理由です。古い文字列を変更することはできません。
String が final である理由の 1 つは、変更可能な動作を実装する String のサブクラスのインスタンスが String の代わりに渡されるのを防ぐためです。
ただし、特定のオブジェクトを変更できるかどうかと、別のオブジェクトを変数に割り当てることができるかどうかは、まったく異なる概念です。1 つは String オブジェクトのプロパティで、もう 1 つは String オブジェクトへの参照である String 変数のプロパティです。
この場合、Java の final キーワードには 2 つの目的があることに注意してください。
The final word on the final キーワード をご覧ください。
String name = "scott";
name = "tiger"; // OK
final String gender = "male";
gender = "female"; // won't compile you cannot reassign gender cause it's final
不変と最終を混同しています。
String は、Integer や Long と同様に、内部データがカプセル化によって変更されないように保護されているという点で不変のクラスです。
ただし、Ayman が言ったように、final は文字列へのポインターを参照します。
変数がfinalとしてマークされている場合、その変数の値は変更できません。つまり、final キーワードを変数と一緒に使用すると、定数になります。プログラムの途中でその変数の値を変更しようとすると、コンパイラはエラーを出します。
注 : 参照型の変数を final としてマークすると、その変数は他のオブジェクトを参照できなくなります。ただし、参照自体のみが最終的なものであるため、オブジェクトの内容を変更できます。
SOURCE : Java の最終キーワード