尝试设置单个位置时整个阵列被重置

时间:2014-03-18 18:00:34

标签: 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());
        }
}

为了澄清,我的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;
    } 
}

问题在于,由于某种原因,每次通过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

所以我希望0留在60.69743 ....并且1留在57.98340 ....他们都被设置为相同(最重新)值。我希望我能说它比那更复杂,但就是这样。发生了什么事?

--- Logan Murphy在下面给出的答案是正确的--- 作为一个注释,你不仅要不时休息一下,以避免你看过多代码的愚蠢错误,但你真的不应该依赖日食“修复”解决方案来制作好的代码:P

1 个答案:

答案 0 :(得分:7)

因为您将变量设置为静态(在类的实例之间共享)。它们需要非静态,如此

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;
    } 
}

这样,PositionHolder类的每个实例都有自己的变量(实例变量是全局声明的非静态变量)