0

所以我正在阅读这个游戏教程,并且有代码可以让带有外星人/导弹的数组列表在碰撞时消失。

  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' 但代码似乎可以正常工作,因为编码器没有将 'a' 或 'm' 对象插入回数组列表中的特定位置(或更新其在数组列表中的相应对象)。

这让我想到,'a' 和 'm' 是通过地址引用到数组列表中的第 i 个对象而不是副本吗?

4

4 回答 4

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...
}
于 2012-09-05T15:24:00.550 回答
3

Java 中的对象总是通过引用复制,除非您克隆它们。因此,除非您使用原语,否则当您使用赋值运算符或从函数返回它时,它是通过引用复制的。

于 2012-09-05T15:24:00.143 回答
1

引用被复制,对象不会被复制,除非你调用像 clone() 这样的东西。

顺便说一句:ArrayList 包含引用。当您将对象的引用添加到 ArrayList 时,该对象不会被复制,并且不会在 ArrayList 中。

于 2012-09-05T15:24:35.073 回答
0

ArrayList.get()为您提供对对象的引用,而不是副本。

于 2012-09-05T15:24:19.560 回答