- PR -

参照型に関して。

1
投稿者投稿内容
ゆう
常連さん
会議室デビュー日: 2001/12/10
投稿数: 33
投稿日時: 2005-02-04 08:28
初めまして。

参照型に関して疑問があります。
javaでのオブジェクトは参照渡しなので、インスタンスを変更すると
全てに影響が出るのは分かるのですが、
リストに追加した場合、インスタンスに変更を入れれば影響が出るけれど
参照は追加した時点のものになってしまいます。
これの仕組みを教えてください。

for (int i = 1; i <= 10; i++) {
 Info info = new Info();
 info.setAccountNo(i + "");
 list.add(info);
}

List newList = new ArrayList();
 for(int k=0;k<list.size();k++){
  // ここで参照をコピーしているのでlistの中身が全て同じ参照にならないのか?
  Info info = (Info)list.get(k);
  newList.add(info);
// ここで仮に以下の処理をやるとリストの中身にも影響が出る。
// ((Info)list.get(k)).setAccountNo("a");
 }

 for(int l=0;l<newList.size();l++){
  System.out.println(((Info)newList.get(l)).getAccountNo());
 }
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-02-04 08:59
引用:

  // ここで参照をコピーしているのでlistの中身が全て同じ参照にならないのか?
  Info info = (Info)list.get(k);
  newList.add(info);


これは、実体をコピーしているわけではななく参照を渡しているだけなので、list と newList の要素は同じインスタンスということになる。

コード:

list
↓
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│1│2│3│4│5│6│7│8│9│10│
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘
↑
newList


こんな感じ。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2005-02-04 10:09
引用:

  // ここで参照をコピーしているのでlistの中身が全て同じ参照にならないのか?
  Info info = (Info)list.get(k);
  newList.add(info);



こんにちわ。

まさにおっしゃられているように参照のコピーであります。
実体のコピーではなく、参照の移動でもなく、参照アドレスのコピーであります。
tak3
ベテラン
会議室デビュー日: 2004/04/15
投稿数: 80
お住まい・勤務地: 菜の花・銀杏
投稿日時: 2005-02-04 10:29
つまり、Javaは全て値渡っていうことなのです。
プリミティブかオブジェクトで値渡、参照渡になるっていうのは、よくある勘違いです。

引用:

(株)ぽちさんの書き込み (2005-02-04 10:09) より:
まさにおっしゃられているように参照のコピーであります。
実体のコピーではなく、参照の移動でもなく、参照アドレスのコピーであります。


コード:

Object o = new Object();
someMethod( o ); // このメソッド呼び出しにより o が nullになることは無い。
o.toString(); // これはNullPointerにならない。
(中略)

void someMethod( Object oCpy ){
oCpy = null; // ここでNULLにするのは oCpy の参照
}


つまり、oとoCpyは同じ参照を持つが別のもの。
oCpy への変更は o に影響を与えるけど、 oCpy を NULLにしても、 oはNULLになりません。

http://java-house.jp/ml/archive/j-h-b/026214.html#body

超訳しますと・・・
oとoCpyがまったく同じものであれば、参照渡し
そうでなくコピーが作られているならば、値渡し


[ メッセージ編集済み 編集者: tak3 編集日時 2005-02-04 10:44 ]
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-02-04 11:57
これこそ よく勘違いされていることですが…。
Java は常に call by value ですが、参照(reference)が渡されることもあります。
1

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