とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

Integerの仮引数は参照渡しか値のコピーか

本日の研修にてJavaのプリミティブ型とオブジェクト型の話を聞いていた。
メソッドへ引数を渡すときにプリミティブ型だと値のコピー。
オブジェクト型だと参照渡しなのは知っていた。


突然Integer型はどうなのかとふと思う。

class Integer2 {
    int value;

    Integer2(int value){
        this.value = value;
    }

    void setValue(int value){
        this.value = value;
    }

    int getValue(){
        return value;
    }
}
class Main{
    public static void main(String args[]){
        Integer2 i = new Integer2(3);
        System.out.println("最初 : " + i.getValue());
        callMethod(i);
        System.out.println("最後 : " + i.getValue());
    }
    
    static void callMethod(Integer2 var)
        var.setValue(5);
        System.out.println("途中 : " + var.getValue());
    }
}


この場合だと実行結果は以下のようになる。

最初 : 3
途中 : 5
最後 : 5


ここでMainクラスを以下のように書き換える

class Main{
    public static void main(String args[]){
        Integer i = new Integer(3);
        System.out.println("最初 : " + i);
        callMethod(i);
        System.out.println("最後 : " + i);
    }
    
    static void callMethod(Integer var)
        var = 5;
        System.out.println("途中 : " + var);
    }
}


この場合だと実行結果は以下のようになる。

最初 : 3
途中 : 5
最後 : 3


・・・Integer型はオブジェクト型だけどなんか挙動が違うらしい。
後ろの席だったのでサブ講師とこの話で討論をしていたが、
callMethod内でInteger型の変数varに5を代入する際に変数が参照から値に変わって、
元の変数に影響が出なくなったのではないかと言われた。


いまいち納得できなかったけど、
本日は時間がなかったので引き下がっといた。
明日また時間を見つけていろいろ試してみよう。