- PR -

ラッパークラスについて

1
投稿者投稿内容
takayan
会議室デビュー日: 2002/12/28
投稿数: 3
投稿日時: 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型の値渡しのような挙動になります。
メソッドの引数にオブジェクトを渡しているにもかかわらず、このようになるのはなぜなのでしょうか。よろしくお願いします。
Aki0
会議室デビュー日: 2003/06/10
投稿数: 1
投稿日時: 2003-07-30 14:38
i = new Integer(j); //100
これでは、メソッド内の引数は更新されていますが、
呼び出し元のインスタンスは更新されないように思います。

返り値で変更するのがいいと思います。

_________________
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2003-07-30 14:52
悩まれているのはラッパークラスの挙動ではないですね。

コード:
private static void method(int i){ 
System.out.println("call method"); 
i = i * i; //100 
System.out.println("i=" + i); 
}


takayanさんは上のコードと同じことをしています。

Javaではすべてメソッドの引数は値渡しされています。
誤解されやすいですが、オブジェクトの参照が値渡しされているわけです。
takayan
会議室デビュー日: 2002/12/28
投稿数: 3
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)