java向ArrayList添加新元素会导致覆盖所有以前插入的项的属性
我在下面的代码片段中遇到了一个问题,其中创建了元素数组,并填充了随后创建的项。输出显示特定元素是引擎类的不同实例(如预期),但在中表示为的属性值(属于引擎输入类型)取自最后创建的元素并复制(引用?)和之前的一样。 我在网上做了研究,发现这种行为的主要原因是:
- 多次使用同一对象
或
- 实例化具有静态字段的类的对象。就我所见,以上原因都不适用于这里(在所使用的类中,唯一的静态字段代表记录器)李>
有人知道为什么中的属性被复制到数组tasks
的所有元素吗
片段
List<Engine> tasks = new ArrayList<>();
for (int i = 0; i < segs.size(); i++) {
Segment s = new Segment(segs.get(i));
EngineInput in = new EngineInput(new Store(store), s);
Engine ce = new Engine(in);
tasks.add(i, ce);
log.debug("-------");
// After completing the i-th step we print a reference of each element of the
//"tasks" array together with a reference of its property "in"
for (int j = 0; j < i; j++) {
log.debug("\t\tj = " + j + " CE : " + tasks.get(j) +
" --> IN : " + tasks.get(j).getIn() );
}
}
输出
请注意,引用foo.calcs.EngineInput@
填充在数组的所有元素上(为什么??)
[DEBUG] 2016-10-17 23:32:11.706 [main] Optimizer - j = 0 CE : foo.calcs.Engine@34414ffc --> IN : foo.calcs.EngineInput@1903b5d [DEBUG] 2016-10-17 23:32:11.792 [main] Optimizer - ------- [DEBUG] 2016-10-17 23:32:11.793 [main] Optimizer - j = 0 CE : foo.calcs.Engine@34414ffc --> IN : foo.calcs.EngineInput@4041739c [DEBUG] 2016-10-17 23:32:11.793 [main] Optimizer - j = 1 CE : foo.calcs.Engine@5cff6b74 --> IN : foo.calcs.EngineInput@4041739c [DEBUG] 2016-10-17 23:32:11.879 [main] Optimizer - ------- [DEBUG] 2016-10-17 23:32:11.880 [main] Optimizer - j = 0 CE : foo.calcs.Engine@34414ffc --> IN : foo.calcs.EngineInput@627ff1b8 [DEBUG] 2016-10-17 23:32:11.881 [main] Optimizer - j = 1 CE : foo.calcs.Engine@5cff6b74 --> IN : foo.calcs.EngineInput@627ff1b8 [DEBUG] 2016-10-17 23:32:11.881 [main] Optimizer - j = 2 CE : foo.calcs.Engine@62b57479 --> IN : foo.calcs.EngineInput@627ff1b8 [DEBUG] 2016-10-17 23:32:11.981 [main] Optimizer - ------- [DEBUG] 2016-10-17 23:32:11.982 [main] Optimizer - j = 0 CE : foo.calcs.Engine@34414ffc --> IN : foo.calcs.EngineInput@29a33620 [DEBUG] 2016-10-17 23:32:11.982 [main] Optimizer - j = 1 CE : foo.calcs.Engine@5cff6b74 --> IN : foo.calcs.EngineInput@29a33620 [DEBUG] 2016-10-17 23:32:11.982 [main] Optimizer - j = 2 CE : foo.calcs.Engine@62b57479 --> IN : foo.calcs.EngineInput@29a33620 [DEBUG] 2016-10-17 23:32:11.982 [main] Optimizer - j = 3 CE : foo.calcs.Engine@ea04cab --> IN : foo.calcs.EngineInput@29a33620 [DEBUG] 2016-10-17 23:32:12.082 [main] Optimizer - -------
共 (0) 个答案