zgc*_*009 0 java arrays object
我有非常直接的代码,我希望我的问题是我刚看了太长时间.我正在测试一些计算,以确保我在投入一个巨大的列表之前就做到了.我想做的就是通过for循环创建一个新对象,并将它们放在我构造的数组中.
我的Main类中public static void main(String args [])的内容:
PositionHolder[] positions = new PositionHolder[8];
PositionHolder currPosition;
int currPos = 0;
for(int i = 0; i <= 7; i++){
/* For Random Points */
currPosition = new PositionHolder(i);
System.out.println("Resetting " + i);
positions[i] = currPosition;
//positions[i].setxPos(100 * Math.random()); // these get set in the
//positions[i].setyPos(100 * Math.random()); // PositionHolder constructor
for(int k = i; k >= 0; k--){
System.out.println(k + ": " + positions[k].getxPos() + ", " + positions[k].getyPos());
}
}
Run Code Online (Sandbox Code Playgroud)
为了澄清,我的PositionHolder类如下:
public class PositionHolder {
private static double xPos;
private static double yPos;
private static int point;
private static boolean visited;
public PositionHolder(int pointNumber){
setxPos(100 * Math.random());
setyPos(-100 * Math.random());
setPoint(pointNumber);
setVisited(false);
}
public double getxPos() {
return xPos;
}
public void setxPos(double xPos) {
PositionHolder.xPos = xPos;
}
public double getyPos() {
return yPos;
}
public void setyPos(double yPos) {
PositionHolder.yPos = yPos;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
PositionHolder.point = point;
}
public boolean isVisited() {
return visited;
}
public void setVisited(boolean visited) {
PositionHolder.visited = visited;
}
}
Run Code Online (Sandbox Code Playgroud)
问题是由于某种原因,每次通过for循环覆盖我放入数组的前一个PositionHolders.作为一个简单的例子,这是从System.println到for循环结束的系统输出的前几行:
Resetting 0
0: 60.697435147416186, -96.35236848097432
Resetting 1
1: 57.98340997157546, -52.56948459757237
0: 57.98340997157546, -52.56948459757237
Resetting 2
2: 45.75236962694197, -32.03840605394901
1: 45.75236962694197, -32.03840605394901
0: 45.75236962694197, -32.03840605394901
Run Code Online (Sandbox Code Playgroud)
所以我希望0保持在60.69743 ....并且1保持在57.98340 ....他们都被设置为相同(最重新)值.我希望我能说它比那更复杂,但就是这样.到底是怎么回事?
--- Logan Murphy在下面给出的答案是正确的---作为一个说明,你不仅应该不时休息一下,以避免你看过太多的代码中的愚蠢错误,但你真的不应该'依靠日食"修复"解决方案来制作好的代码:P
因为您将变量设置为静态(在类的实例之间共享).他们需要像这样非静态
public class PositionHolder {
private double xPos;
private double yPos;
private int point;
private boolean visited;
public PositionHolder(int pointNumber){
setxPos(100 * Math.random());
setyPos(-100 * Math.random());
setPoint(pointNumber);
setVisited(false);
}
public double getxPos() {
return xPos;
}
public void setxPos(double xPos) {
this.xPos = xPos;
}
public double getyPos() {
return yPos;
}
public void setyPos(double yPos) {
this.yPos = yPos;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
public boolean isVisited() {
return visited;
}
public void setVisited(boolean visited) {
this.visited = visited;
}
}
Run Code Online (Sandbox Code Playgroud)
这样,PositionHolder类的每个实例都有自己的变量(实例变量是全局声明的非静态变量)