2011-02-04 74 views
1

我有一個問題,我的數組中的每個元素似乎都被重新分配了。對象數組賦值問題

class Car { 
    private static int nom = 0; 
    private static String whee = ""; 
    public void setCar(int r, String s) { 
     this.nom = r; 
     this.whee = s; 
    } 
} 

class Rawr { 
    private Car[] jar = new Car[3]; 

    public Mar() { 
     jar[0] = new Car(); 
     jar[1] = new Car(); 
     jar[2] = new Car(); 
     jar[0].setCar(2, "yar"); 
     jar[1].setCar(3, "tar"); 
     jar[2].setCar(4, "sars"); 
    } 
} 

如果我印像jar[0].nom + jar[0].whee + jar[1].nom + jar[2].whee + jar[3].whee,輸出會

4 sars 4 sars sars 
+0

歡迎來到StackOverflow。當你問你的問題時,右邊有這個方便的**如何格式**框。值得一讀,就像問題區域上方的** [?] **那樣[鏈接頁面](http://stackoverflow.com/editing-help)。當你編寫你的questino時,會預覽它在文本框下面的樣子。 – 2011-02-04 13:39:56

回答

5

變化

private static int nom = 0; 
private static String whee = ""; 

private int nom = 0; 
private String whee = ""; 

static意味着變量由所有實例共享。 (您可以使用this來引用靜態變量,這是一個Java奇怪的事實。)

+2

通常,不要在構造函數中設置靜態字段。嘗試使這些字段成爲'final'。這可以幫助您避免很多錯誤。 – 2011-02-04 13:49:01

0

您的nom和whee字段是靜態的。這意味着它們綁定到類,而不是類的對象(實例)。

因此,當您爲this.nom分配一個新值時,實際上,您將值賦給Car.nom。編譯器允許通過對象引用靜態變量,但這是非常糟糕的做法。你應該總是參考他們班的靜態字段:Car.nom,Car.whee。這清楚地表明,nom和whee是靜態的,並且因此被該類的所有實例共享。在這種情況下,這些字段不應該是靜態的:每個Car實例都有自己的名字和whee(無論它是什麼)。

0

構建代碼的更好方法如下。

class Car { 
    private final int nom; 
    private final String whee; 
    public Car(int nom, String whee) { 
     this.nom = nom; 
     this.whee = whee; 
    } 
    public String toString() { return num + " " + whee; } 
} 

class Rawr { 
    private final Car[] jar = {new Car(2, "yar"), new Car(3, "tar"), new Car(4, "sars")}; 
    public String toString() { 
     return Arrays.toString(jar); 
    } 
}