2014-03-18 42 views
0

我真的很直接的代碼,我希望我的問題是我剛纔看了太久。我正在測試一些計算,以確保在我投入巨大列表之前,我正在進行計算。我想要做的就是通過一個for循環創建一個新對象,並將它們拋入我構造的數組中。整個陣列在試圖設置單個位置時被重置

在我的主類公共靜態無效的主要(字符串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。作爲一個簡單的例子,這裏是對的結束for循環我從System.println輸出系統的前幾行:

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 ....他們都被設置爲相同的(最resent)價值。我希望我能說它比這更復雜,但就是這樣。到底是怎麼回事?

--- Logan Murphy在下面給出的答案是正確的--- 作爲一個說明,不僅應該不時地休息一下以避免代碼中的愚蠢錯誤,但你真的不應該依賴日食「修復」解決方案來製作好代碼:P

回答

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的每個實例都有它自己的變量(實例變量是全局聲明的變量都是非靜態)

+0

哈哈看看這是爲什麼我甚至不會弄亂靜態,因此甚至沒有考慮過它。我只是做了一個例子來測試,所以我可以在我的代碼中使用算法的功能。愚蠢的靜力學。謝謝,我會檢查這個,但它應該是好的。 – zgc7009

+0

你知道些什麼,它驚喜的效果。這就是爲什麼你不能看太久的代碼(並且不要依賴日食快速「修復」) – zgc7009