29

次のステートメントの違いは何ですか

String name = "Tiger";

final String name ="Tiger";

Stringクラスはクラスですがfinal、なぜ文字列「CONSTANT」変数をfinalとして作成する必要があるのでしょうか。

4

7 に答える 7

58

finalこのコンテキストでは、変数nameは1回しか割り当てることができないことを意味します。別のオブジェクトを再度割り当てるStringと、コンパイルエラーが発生します。

finalここでの混乱の原因は、キーワードがいくつかの異なるコンテキストで使用できることだと思います。

  • 最終クラス:クラスをサブクラス化することはできません。
  • 最終メソッド:メソッドをオーバーライドすることはできません。
  • 最終変数:変数は1回だけ割り当てることができます。

それぞれの場合の例については、Javaでのfinalに関するウィキペディアの記事を参照してください。

于 2009-05-17T16:55:10.163 に答える
4

「最終」は、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 変数のプロパティです。

于 2009-05-17T17:09:38.657 に答える
2

この場合、Java の final キーワードには 2 つの目的があることに注意してください。

  • これは、参照を別の文字列に設定できないことを意味します。つまり、後で "name = ..." を実行することはできません。
  • しかし重要なのは、参照が他のスレッドに正しく公開されていることを意味します(詳細については、リンクされた記事を参照するか、Goetz らの「Java Concurrency in Practice」などの作品を参照してください。
于 2009-05-17T17:08:41.653 に答える
1

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
于 2009-05-18T09:04:48.367 に答える
1

不変と最終を混同しています。

String は、Integer や Long と同様に、内部データがカプセル化によって変更されないように保護されているという点で不変のクラスです。

ただし、Ayman が言ったように、final は文字列へのポインターを参照します。

于 2009-05-17T17:06:53.480 に答える
0

変数がfinalとしてマークされている場合、その変数の値は変更できません。つまり、final キーワードを変数と一緒に使用すると、定数になります。プログラムの途中でその変数の値を変更しようとすると、コンパイラはエラーを出します。

注 : 参照型の変数を final としてマークすると、その変数は他のオブジェクトを参照できなくなります。ただし、参照自体のみが最終的なものであるため、オブジェクトの内容を変更できます。

SOURCE : Java の最終キーワード

于 2012-01-11T06:44:25.257 に答える