- - PR -
参照型に関して。
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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()); } | ||||||||
|
投稿日時: 2005-02-04 08:59
これは、実体をコピーしているわけではななく参照を渡しているだけなので、list と newList の要素は同じインスタンスということになる。
こんな感じ。 | ||||||||
|
投稿日時: 2005-02-04 10:09
こんにちわ。 まさにおっしゃられているように参照のコピーであります。 実体のコピーではなく、参照の移動でもなく、参照アドレスのコピーであります。 | ||||||||
|
投稿日時: 2005-02-04 10:29
つまり、Javaは全て値渡っていうことなのです。
プリミティブかオブジェクトで値渡、参照渡になるっていうのは、よくある勘違いです。
つまり、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 ] | ||||||||
|
投稿日時: 2005-02-04 11:57
これこそ よく勘違いされていることですが…。
Java は常に call by value ですが、参照(reference)が渡されることもあります。 |
1