2015-02-11 48 views
0

如下:我创建了一个ArrayList中有自己的对象这使两个int(X,Y)ArrayList中不保存我的价值观

但我只得到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开始:: 3

首蛇身创建:XY->:0:0

首蛇身创建:XY->:0:0

首蛇身创建:XY->:0:0

回答

4

你想CH安格

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

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

你实际上做的是接收到的参数分配类的价值观是什么,它永远不会更新​​

位置顺便说一句,我认为将您的构造函数的参数命名为类变量是一种不好的做法,就像您忽略了关键字this一样,不清楚分配给什么的内容。

+0

就是这样。谢谢 – Nick 2015-02-11 18:11:36

+0

@Nick不客气:) – 2015-02-11 18:12:57

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 

它总是值得尝试查明究竟是问题是,试图一次删除一个代码,直到行为改变。

(这也是一个好主意,使所有领域的私人,但这是一个稍微不同的问题。)