好的,这是代码,然后进行讨论:
public class FlatArrayList {
private static ArrayList<TestWrapperObject> probModel = new ArrayList<TestWrapperObject>();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int [] currentRow = new int[10];
int counter = 0;
while (true) {
for (int i = 0; i < 10; i++) {
currentRow[i] = probModel.size();
}
TestWrapperObject currentWO = new TestWrapperObject(currentRow);
probModel.add(counter, currentWO);
TestWrapperObject testWO = probModel.get(counter);
// System.out.println(testWO);
counter++;
if (probModel.size() == 10) break;
}
// Output the whole ArrayList
for (TestWrapperObject wo:probModel) {
int [] currentTestRow = wo.getCurrentRow();
}
}
}
public class TestWrapperObject {
private int [] currentRow;
public void setCurrentRow(int [] currentRow) {
this.currentRow = currentRow;
}
public int [] getCurrentRow() {
return this.currentRow;
}
public TestWrapperObject(int [] currentRow) {
this.currentRow = currentRow;
}
}
上面的代码应该做什么?我想做的是将数组加载为某些包装对象(在我们的例子中为TestWrapperObject)的成员。当我跳出循环时,
probModel ArrayList具有应该具有的元素数量,但是所有元素都具有与最后一个元素相同的值(大小为10的数组,每一项等于9)。循环内部情况并非如此。如果您使用原始int值执行相同的“实验”,则一切正常。我是否缺少关于数组作为对象成员的某些东西?还是我刚刚遇到Java错误?我正在使用Java 6。
最佳答案
您仅创建currentRow
数组的一个实例。将其移动到行循环内,它的行为应更像您期望的那样。
具体来说,setCurrentRow
中的分配不会创建对象的副本,而只会分配引用。因此,包装对象的每个副本都将包含对同一int[]
数组的引用。更改该数组中的值将使所有其他引用该数组实例的包装器对象的值看起来都发生变化。