我需要知道爲什麼會發生以下情況,在此代碼中(最後兩個塊)我期望完全相同的輸出,但本地對象(僅僅是引用列表中的對象,對嗎?)在列表更新時處於舊狀態。我有一個錯誤,因爲在我的gamecode類似的複製過程(tilebased,對象交換位置,所以我想,爲什麼不只是交換他們引用...)引用和複製對象,意外的行爲
例子:
package game;
import java.util.ArrayList;
public class Tester {
private String s;
private Foo foo;
public Tester(String s, String f) {
this.s = s;
this.foo = new Foo(f);
}
class Foo {
private String f;
public Foo(String f) {
this.f = f;
}
}
@Override
public String toString() {
return foo.f + ":" + s;
}
public void swap(Tester other) {
String tempS = this.s;
Foo tempFoo = this.foo;
this.s = other.s;
this.foo = other.foo;
other.s = tempS;
other.foo = tempFoo;
}
public static void main(String[] args) {
ArrayList<Tester> test = new ArrayList<Tester>();
test.add(new Tester("First", "1"));
test.add(new Tester("Second", "2"));
System.out.println("After initializing list");
for (Tester t : test) {
System.out.println(t);
}
Tester first = test.get(0);
Tester second = test.get(1);
Tester tmp = first;
first = second;
second = tmp;
System.out.println("\nAfter temps");
System.out.println(first);
System.out.println(second);
System.out.println("\nList changed after temps?");
for (Tester t : test) {
System.out.println(t);
}
System.out.println("\nAfter swap");
first.swap(second);
System.out.println(first);
System.out.println(second);
System.out.println("\nList after swap");
for (Tester t : test) {
System.out.println(t);
}
}
}
和輸出:
After initializing list
1:First
2:Second
After temps
2:Second
1:First
List changed after temps?
1:First
2:Second
After swap
1:First
2:Second
List after swap
2:Second
1:First
我想我是有點不清楚,我總是打印出第一然後第二(的對象),所以「經過交換」應該看起來就像「交換後名單」,對調換後的名單已經改變本地對象,本地對象(同樣,僅僅是對列表中的對象的引用?) 沒有。
要在答案的評論:雖然我的困惑被清除,我的問題解決了,我問是否有可能去的對象列表的實際基準,這樣,當我把它指向別的東西列表也會自動指向其他的東西。在下面的示例中,Foo a
首先指向具有屬性A
的對象Foo
,但是此參考從list.get()
獲得。現在,如果我將它指向new Turtles()
,則列表仍將指向Foo with A
。
我一直希望有一個「硬」的參考,所以當我指向海龜時,數組列表指向海龜。
這樣做會使交換更容易,但我還不確定如何實現可以做到這一點的列表(如果可能的話),這將非常適合我的遊戲的特定需求。
對於新用戶,您的代碼清爽整潔。謝謝! – Zyerah 2013-04-07 20:08:57