2017-05-11 17 views
1

不変オブジェクトを作成するために使用されている私は、空白の変数は、そのメンバーのコードの作業の次の行には何の問題ブランクfinal変数が

import java.util.*; 

class B 
{ 
    int a; 
}  
public class BlankFinal 
{ 
    public static void main(String args[]) 
    { 
     final B b; 
     b=new B(); 
     b.a=1; 

     System.out.println(b.a); 

     b.a=23;   // b object's a member is changed even though b is 
         // blank final 

     System.out.println(b.a); 

    }  
} 
せずにどのように を変更することができないのjavaつまりオブジェクトで不変オブジェクトを作成するために使用されていることを知っています
+1

袋が最後の場合は、別の袋に交換することはできません。 – khelwood

+0

いいえanalogyありがとう –

答えて

2

bがfinalであるという事実は、新しい値をb(初期初期化後)に割り当てることができないようにします。 bによって参照されるオブジェクトの状態を変更するメソッド、またはbによって直接参照されるオブジェクトのインスタンス変数を直接変更するメソッド(b.a = ...)をBというメソッドから呼び出すことはできません。

1

B bへの参照は最終的なものであり、変更することはできません。データフィールドb.aの値を変更しようとすると、その参照が変更されないため、変更することができます。

+1

コンストラクタで初期化せずにほとんど正しいが 'final int a'は動作しません。 –

+0

しかし、コンストラクタの外側(BlankFinal内)で初期化することはできますが、再割り当ては機能しません。 –

+0

真実ですが、現状ではコンパイルされません。 –