ArrayList不保存我的值

时间:2015-02-11 17:29:47

标签: java

以下:我创建一个带有Own Object的ArrayList,它保留两个int(x,y)

但我只得到0而不是数字。我不明白为什么它不起作用。

public class Snake {

public class SnakeBody {
    public int x;
    public int y;
    SnakeBody(int x, int y){
        x = this.x;
        y = this.y;}
}

protected ArrayList<SnakeBody> SnakeBody = new ArrayList<SnakeBody>();
protected PointF Fruit;

protected boolean GameStarted = false;

//Constructor
public Snake(){}

public void startSnake()
{
    if(!GameStarted)
    {
        GameStarted = true;
        SnakeBody.add(new SnakeBody(1,14));
        SnakeBody.add(new SnakeBody(2,14));
        SnakeBody.add(new SnakeBody(3,14));
        int itemcount = SnakeBody.size();
        Log.d("Snake.java:Game started: ", "" + itemcount);
        for(int i=0; i<itemcount; i++){
            Log.d("First Snake created: XY->", "" + SnakeBody.get(i).x + ":" + SnakeBody.get(i).y);
        }
    }
}

然后我得到的是Log.d输出:

Snake.java:Game started :: 3

创建了第一个蛇:XY-&gt;:0:0

创建了第一个蛇:XY-&gt;:0:0

创建了第一个蛇:XY-&gt;:0:0

2 个答案:

答案 0 :(得分:4)

您想要更改

SnakeBody(int x, int y){
    x = this.x;
    y = this.y;
}

SnakeBody(int x, int y){
    this.x = x;
    this.y = y;
}

您实际在做的是将类的值分配给接收的参数,它永远不会更新SnakeBody

的位置

顺便说一句,我认为将构造函数的参数命名为与类变量相同是一种不好的做法,就像忽略this关键字一样,不清楚分配给什么。< / p>

答案 1 :(得分:3)

看看你的构造函数:

SnakeBody(int x, int y){
        x = this.x;
        y = this.y;}

在两种情况下,都将的值实例字段复制到参数。换句话说,您将使用来自其他未初始化字段(始终为0)的值覆盖有用数据(调用者传入的值)。你想要它反过来:

SnakeBody(int x, int y) {
    this.x = x;
    this.y = y;
}

请注意,这与ArrayList方面无关 - 您只需写下来就可以观察到同样的事情:

SnakeBody body = new SnakeBody(1, 2);
System.out.println(body.x); // 0

总是值得尝试精确定位 问题,尝试一次删除一些代码,直到行为发生变化。

(将所有字段设为私有也是一个好主意,但这只是一个稍微不同的事情。)