以下:我创建一个带有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
答案 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
总是值得尝试精确定位 问题,尝试一次删除一些代码,直到行为发生变化。
(将所有字段设为私有也是一个好主意,但这只是一个稍微不同的事情。)