web-dev-qa-db-ja.com

可変クラスの最終変数の値を変更できますか?

以下は、最終的な変数の値を変更しようとしたコードです。最初に「a」を出力し、次に「ab」を出力します。では、最終的な変数の値を変更できるとしたら、変数を最終的なものとして宣言するメリットは何でしょうか?次に、最終的なキーワードの使用は何ですか?誰でもこれを手伝ってくれる??????

package test_new;
public class FinalVarValueChange {
    public static void main(String[] args){
       final StringBuffer s=new StringBuffer("a");
       System.out.println("s before appending  :"+s);
       s.append("b");
      System.out.println("s after appending  :"+s);     
   }
}
11
Eagle

finalは、参照が参照しているオブジェクトの不変性を強制しません(それはnotはC++のconstと同じです)。

変数をfinalとしてマークすると、その変数に別のオブジェクト参照を割り当てることができなくなります。

たとえば、次のコードはコンパイルされません。

final StringBuffer s=new StringBuffer("a");
s = new StringBuffer("another a"); /*not possible to reassign to s*/

Runnables、Callables、およびロックイディオムを使用する場合に役立ちます。

21
Bathsheba

StringBufferはその設計に従って変更可能であり、メソッドappendはその内容を変更するための単なるメソッドです。

Javaでの最後の変数の意味は次のとおりです:

  • オブジェクトの場合、これはこの参照に別のオブジェクトを割り当てることはできませんを意味しますが、このオブジェクトのメソッドの呼び出しを停止しませんです。

  • 基本型変数(int、float、booleanなど)の場合、ここには参照とポインタ、およびオブジェクトメソッドがないため、単に変数の値を変更できないことを意味します。

次のコードを取る

final ObjectA objA = new ObjectA();

もちろん、以下のようにこのオブジェクトのメソッドを呼び出すことができます

objA.setXXX() //legal for a final variable objA

SetXXX()メソッドの副作用は、ここではfinalキーワードによって制御されません。

しかし、次のコードの場合

final int a = 123;

以下のように、この変数に新しい値を割り当てることはできません

a = 234; //Not legal if a has been defined as a final int variable.

しかし、以下のように整数を使用して定義している場合

final Integer a = new Integer(123);

以下のようにオブジェクトaのメソッドを呼び出すことができます

a.xxx()

一般的に言えば、最終定義はオブジェクトと基本変数で異なります。

6
Lawrence Liu

final修飾子は、変数、つまりオブジェクトへの参照を変更できない、つまり同じ変数に他の値を割り当てることができないことを意味します。ただし、オブジェクト自体の状態は変更できます。

3
AlexR

最終的な変数/参照は、その参照に別の値を再割り当てできないことを意味しますが、オブジェクトの状態を変更できます。

ここでは、StringBufferオブジェクトs内部状態を変更しています

1

最後のキーワードは、変数が保持するreferenceが変更されないようにします。参照されるインスタンスのstateは変更される可能性があります。探している可能性が高いのは、参照されているインスタンスのimmutabilityです。これはインスタンスの責任です。

1
Harmlezz

「final」は、StringBufferへの参照である変数sbを指します。これは最終的なものであるため、sbに別のStringBufferを参照させることはできません。ただし、(ご存じのとおり)sbが現在参照しているStringBufferオブジェクトを変更することはできます。このコードをコンパイルしてみてください

final StringBuffer sb = new StringBuffer();  
sb.append("abc");  
sb.append("xyz");  
sb = new StringBuffer();  
1
Shriram