- - PR -
ラッパークラスについて
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-07-30 14:21
はじめまして、JAVAの初心者です。
ラッパークラスの挙動が理解できません。(自分でいろいろ調べましたが見当もつきません。) どなたか、ご教授いただけますようお願いします。 public class MyClass { public static void main(String[] args){ MyClass cls = new MyClass(); int i = 10; Integer wrap = new Integer(i); //ラッパークラス int[] arr = {i}; //配列 IntX x = cls.new IntX(i); //自作オブジェクト System.out.println("wrap=" + wrap.toString()); System.out.println("arr=" + arr[0]); System.out.println("x=" + x.x); method(wrap); method2(arr); method3(x); System.out.println("wrap=" + wrap.toString()); System.out.println("arr=" + arr[0]); System.out.println("x=" + x.x); } private static void method(Integer i){ System.out.println("call method"); int j = i.intValue(); j = j * j; i = new Integer(j); //100 System.out.println("i=" + i.toString()); } private static void method2(int[] i){ System.out.println("call method2"); i[0] = i[0] * i[0]; System.out.println("i[0]=" + i[0]); } private static void method3(IntX x){ System.out.println("call method3"); x.x = x.x * x.x; System.out.println("x=" + x.x); } class IntX { public int x; public IntX(int x){ this.x = x; } } } と、このようなクラスを作り実行したところ、 wrap=10 arr=10 x=10 call method i=100 call method2 i[0]=100 call method3 x=100 wrap=10 arr=100 x=100 となり、ラッパークラスだけint型の値渡しのような挙動になります。 メソッドの引数にオブジェクトを渡しているにもかかわらず、このようになるのはなぜなのでしょうか。よろしくお願いします。 | ||||
|
投稿日時: 2003-07-30 14:38
i = new Integer(j); //100
これでは、メソッド内の引数は更新されていますが、 呼び出し元のインスタンスは更新されないように思います。 返り値で変更するのがいいと思います。 _________________ | ||||
|
投稿日時: 2003-07-30 14:52
悩まれているのはラッパークラスの挙動ではないですね。
takayanさんは上のコードと同じことをしています。 Javaではすべてメソッドの引数は値渡しされています。 誤解されやすいですが、オブジェクトの参照が値渡しされているわけです。 | ||||
|
投稿日時: 2003-07-30 15:16
AkiO様、まりり様、早速のご返答ありがとうございます。
まりり様のおっしゃる通りです。自分としては、 private static void method(Integer i){ System.out.println("call method"); int j = i.intValue(); j = j * j; i = new Integer(j); //100 ←<この部分> System.out.println("i=" + i.toString()); } <この部分>で参照先を更新したつもりでいました。 でも、i がさしている先が変わっただけだったのですね。 やっと理解できました。 ありがとうございました。 | ||||
1
