我整天都在用这个把头发拉出来。可能是某种新手错误,但我无法理解。

它开始更复杂,但我已将其简化为:

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/

10-11 04:13