2011-02-04 75 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); 
    } 
}