我需要知道为什么会发生以下情况,在这段代码(最后两个块)中,我希望输出完全相同,但本地对象(它们只是对列表中对象的引用,对吗?)处于旧状态,而列表已更新。我有一个错误,因为我的游戏代码中有一个类似的复制过程(基于图块,对象交换位置,所以我想为什么不只是交换它们的引用......)
例子:
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
首先指向Foo
具有属性的对象A
,但该引用来自list.get()
。现在,如果我将它指向new Turtles()
列表仍将指向Foo with A
.
我希望有一个“硬”引用,这样当我指向海龟时,arraylist 就会指向海龟。
这将使交换更容易,但我不确定如何实现一个可以做到这一点的列表(如果可能的话),这将非常适合我的游戏的特定需求。