gpt4 book ai didi

ArrayList 的 Java 数组 - 奇怪的事情发生了吗?

转载 作者:搜寻专家 更新时间:2023-11-01 00:59:20 25 4
gpt4 key购买 nike

我一整天都在为这个烦恼。可能是某种新错误,但我无法理解它。

开始时比较复杂,但我已将其简化为:

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 值,并且每次调用构造函数时它都会更改。您需要删除 static 修饰符,然后一切都应该按计划工作!

为避免将来出现此类问题,最好至少在开始时不要像这样将事物声明为静态的 - 尽可能保持对象不变,即使您知道自己只是在创建一个对象!这会让您拥有良好的 OO 心态并减少这些类型的问题。当然,有些地方您需要使用它,这是正确的做法,但您会在使用过程中了解到这一点。

关于ArrayList 的 Java 数组 - 奇怪的事情发生了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6931578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com