所以我正在阅读this游戏教程,并且有一些代码可以让外星人/导弹的阵列列表在碰撞时消失。
ArrayList ms = craft.getMissiles();
for (int i = 0; i < ms.size(); i++) {
Missile m = (Missile) ms.get(i);
Rectangle r1 = m.getBounds();
for (int j = 0; j<aliens.size(); j++) {
Alien a = (Alien) aliens.get(j);
Rectangle r2 = a.getBounds();
if (r1.intersects(r2)) {
m.setVisible(false);
a.setVisible(false);
}
}
}
在最后一个循环中,m.setVisible(false)和a.setVisible(false)使特定的外星人/导弹不可见,但是'a'和'm'不是ArrayList对象拉出的ArrayList的一部分,虽然编码器没有将'a'或'm'对象插回到arraylist中的特定位置(或更新其在arraylist中的相应对象),但是代码似乎工作得很好
这让我想到,是'a'和'm'是通过地址引用到arraylist中的第i个对象而不是副本?
答案 0 :(得分:4)
是。他们是参考。任何时候你说
A a = new A();
在Java中,a
是引用,不是实际对象(常见的混淆源)。
使用标准集合时,从该集合中获取元素将返回对包含对象的引用。因此,遍历集合并对包含的对象执行更改是微不足道的。
for(int i = 0; i < list.size(); i++) {
list.get(i).clear(); // changes the object in the list...
}
答案 1 :(得分:3)
除非您克隆它们,否则始终通过引用复制Java中的对象。因此,除非您正在使用基元,否则在使用赋值运算符或从函数返回时,它将通过引用进行复制。
答案 2 :(得分:1)
引用,除非你调用clone()之类的东西,否则不会复制对象。
BTW:ArrayList包含引用。将对象的引用添加到ArrayList时,不会复制该对象,也不会将其复制到ArrayList中。
答案 3 :(得分:0)
ArrayList.get()
为您提供对象的引用,而不是副本。