我整天都在用这个把头发拉出来。可能是某种新手错误,但我无法理解。
它开始更复杂,但我已将其简化为:
public class Main {
static ArrayList<Selection>[] a = new ArrayList[2];
public static void main(String[] args) {
// Initialise the Selection ArrayList
for (int i=0; i < a.length; i++) {
a[i] = new ArrayList<Selection>();
}
callTest();
}
public static void callTest () {
a[0].add(new Selection(true));
a[1].add(new Selection(false));
System.out.println(a[0].get(0).getTF());
System.out.println(a[1].get(0).getTF());
}
}
class Selection {
private static boolean trueFalse;
public Selection (boolean iTF) {
trueFalse = iTF;
}
public boolean getTF () {
return trueFalse;
}
}
运行程序会返回:
false
false
而不是预期的(至少对我而言):
true
false
有人可以对此有所了解吗?似乎每当 Selection 对象中保存的值发生更改时,所有 Selection 对象都会更改,即使它们具有不同的对象引用。我做了什么傻事吗?
最佳答案
这是因为 truefalse
是静态的,是类的一部分而不是对象的一部分。因此,所有 Selection 对象只有一个 truefalse
值,并且每次调用构造函数时都会更改它。您需要删除静态修饰符,然后一切都应该按计划进行!
为了避免将来出现这样的问题,最好至少在您开始时不要像这样将事物声明为静态 - 尽可能保持对象,即使您知道自己只是在创建一个!这让您拥有良好的 OO 心态并减少这些类型的问题。当然,在某些地方您需要使用它并且这是正确的做法,但是您会在使用过程中了解到这一点。
关于ArrayList 的 Java 数组 - 发生了什么奇怪的事情?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6931578/