4

一般に、変数が final と宣言されている場合、その変数の値をオーバーライドすることはできませんが、文字列バッファーを使用する場合、これはうまくいきません。誰かが理由を教えてもらえますか?

以下のコードは機能します!!!!!!

  public static void main(String args[]) {
        final StringBuffer a=new StringBuffer("Hello");
        a.append("Welcome");
        System.out.println(a);
    }

出力:

こんにちはようこそ

4

4 に答える 4

9

Java言語仕様から(強調鉱山):

最終変数が割り当てられると、常に同じ値が含まれます。最終変数がオブジェクトへの参照を保持している場合、オブジェクトの状態はオブジェクトに対する操作によって変更される可能性がありますが、変数は常に同じオブジェクトを参照します。

したがって、が指すオブジェクトの状態を操作しても問題ありませんa

a.append("Welcome"); //is OK

aしかし、別のオブジェクトで再割り当てすることはできません

final StringBuffer a = new StringBuffer("Hello");
a = new StringBuffer("World"); //this wont compile
于 2013-03-21T20:16:24.653 に答える
4

final 変数でできないことは、別のオブジェクト (またはプリミティブ値) または null を参照するように変更することです。

そこでは、常に同じオブジェクトを参照し、文字列とは異なり、文字列バッファーは不変ではありません。

取得する必要があるのは、変数の値が、そのオブジェクトの実際のコンテンツではなく、stringbuffer への参照であることです。

于 2013-03-21T20:13:01.137 に答える
0

変数がfinalと宣言されている場合、その変数の値をオーバーライドすることはできません

正しい。最終変数が割り当てられると、それを再割り当てすることはできません。コンパイラはそれを許可しません。

しかし、文字列バッファを使用する場合、これは適切ではありません。

はい、そうです。

以下のコードは機能します!!!!!!

コードはあなたが説明する問題を示していません。これは、参照がfinalであるオブジェクトを引き続き変更できることを示しています。それはまったく別のことです。

于 2013-03-22T01:15:25.490 に答える
0

Mutable および Immutable objects を読む必要があります。

不変クラスの例: String、Integer、Long 可変クラスの例: StringBuffer、Date

可変オブジェクトでは、構築後に状態を変更できます。

final StringBuffer a=new StringBuffer("Hello");
a.append("Welcome");

不変では、構築後にオブジェクトの状態を変更することはできません。

于 2013-03-21T20:25:15.977 に答える