本日の研修にて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を代入する際に変数が参照から値に変わって、
元の変数に影響が出なくなったのではないかと言われた。
いまいち納得できなかったけど、
本日は時間がなかったので引き下がっといた。
明日また時間を見つけていろいろ試してみよう。