Java メンバ変数を参照しているメンバ変数の初期化について


まず、以下のようなプログラムがあります。

[code]

    public class Test {
    
       public Test(int value){
            num = value;
       }
    
       private int num;
    
       private String str = "value:" + num;
    
       public void aaa(){
          System.out.println(str);
       }
    }
    
[/code]

Testクラスインスタンス生成時に、引数として「5」を渡した場合、  
aaa()の出力結果で、「value:5」と出てほしいのですが、現在は「value:0」となってしまいます。

解決方法の分かる方がいましたら、ご教授をお願い致します。




[初期化子やコンストラクタの実行タイミング](http://minor.hatenablog.com/entry/20101122/1290437595)
は、まずクラスロード時点でstatic変数の初期化が実行され、その後にコンストラクタによるインスタンス生成が行われます。

`str`変数が1度作成されると、その後に`num`の値を変更しても`str`の値は変わりません。  
例えば以下の対応方法が考えられます。

[code]

    //方法1. numと一緒にstrも初期化
    public Test(int value) {
        num = value;
        str = "value:" + num;
    }
    //方法2. numを設定するメソッドを作ってnumと一緒にstrも初期化
    public Test(int value) {
        setNum(value);
    }
    private setNum(int value) {
        num = value;
        str = "value:" + num;
    }
    //方法3. numもstatic変数にして、動的にstrを生成するためのgetStrメソッドを作る
    private static int num;
    private static String getStr() {
        return "value:" + num; //この方法ならインスタンス初期化時に更新されたnumが反映される
    }
    
[/code]




[初期化子やコンストラクタの実行タイミング](http://minor.hatenablog.com/entry/20101122/1290437595)
は、まずクラスロード時点でstatic変数の初期化が実行され、その後にコンストラクタによるインスタンス生成が行われます。

`str`変数が1度作成されると、その後に`num`の値を変更しても`str`の値は変わりません。  
例えば以下の対応方法が考えられます。

[code]

    //方法1. numと一緒にstrも初期化
    public Test(int value) {
        num = value;
        str = "value:" + num;
    }
    //方法2. numを設定するメソッドを作ってnumと一緒にstrも初期化
    public Test(int value) {
        setNum(value);
    }
    private setNum(int value) {
        num = value;
        str = "value:" + num;
    }
    //方法3. numもstatic変数にして、動的にstrを生成するためのgetStrメソッドを作る
    private static int num;
    private static String getStr() {
        return "value:" + num; //この方法ならインスタンス初期化時に更新されたnumが反映される
    }
    
[/code]

