将对象添加到此arraylist时,它们都变得相同

时间:2013-12-20 20:54:18

标签: java arraylist

public void fillWith(TileEntity tile){
    for(int i = 0; i < this.height; i++){//for every x and y value
        for(int j = 0; j < this.width; j++){
            tile.x = j;
            tile.y = i;
            this.tiles.add(tile);
        }
    }
}

好的,所以上面的代码应该用TileEntity磁贴填充关卡。当我在行#34; this.tiles.add(tile)&#34;之前打印出x和y coords时,每个tile都有不同的coords。但是当我打印出ArrayList&#34; tiles&#34;中所有图块的x和y坐标时,每一个都是(9,9)。它们都与添加到arraylist的最后一个tile相同。谢谢!

3 个答案:

答案 0 :(得分:7)

您继续在for循环中添加相同的对象。

如果要添加不同的对象,则需要使用例如new TileEntity()创建新实例。

public void fillWith(){
    TileEntity tile;
    for(int i = 0; i < this.height; i++){//for every x and y value
        for(int j = 0; j < this.width; j++){
            tile = new TileEntity();
            tile.x = j;
            tile.y = i;
            this.tiles.add(tile);
        }
    }
}

你是对的,在你的代码示例中,每次进入循环时值都会发生变化,但由于tile每次迭代都指向同一个对象,因此只会更改x和<{1}} 对象中的值。 (当您更改y和/或x时,Java不会为您创建新对象。当您向数组y添加tile时,它会this.tiles您添加的对象 - 它不会复制它。

总而言之,reference 数组中的每个对象都将指向同一个tile实例。

答案 1 :(得分:1)

您已成功将相同的tile添加到ArrayList 100次。此处仍然只有一个对象,因此上次更新“获胜”:x = 9y = 9

如果你想要不同的值,那么你必须添加100个不同的平铺对象,每个对象都有自己不同的值。

答案 2 :(得分:1)

每次在循环中都需要创建新的tile对象,否则每次现有的tile对象都会更改并保留最后插入的值。

 for(int j = 0; j < this.width; j++){
            tile= new TileEntity();
            tile.x = j;
            tile.y = i;
            this.tiles.add(tile);
        }