我有一个问题,我的数组的每个元素似乎都被重新分配。
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 :(得分:6)
这是因为你的变量是静态的,即它们属于类,而不是属于实例。请查看Java Tutorials | Understanding Instance and Class Members以获取有关此含义的更多信息。
您应该删除static
关键字,以便它们成为实例变量。
答案 1 :(得分:5)
更改
private static int nom = 0;
private static String whee = "";
到
private int nom = 0;
private String whee = "";
static
表示变量由所有实例共享。 (您可以使用this
来引用静态变量这一事实是Java的一个奇怪现象。)
答案 2 :(得分:0)
你的nom和whee字段是静态的。这意味着它们与类相关联,而不是与类的对象(实例)相关联。
因此,当您为this.nom分配新值时,实际上,您将该值赋给Car.nom。编译器允许通过对象引用静态变量,但这是非常糟糕的做法。你应该总是按类来引用静态字段:Car.nom,Car.whee。这清楚地表明nom和whee是静态的,因此被类的所有实例共享。在这种情况下,这些字段不应该是静态的:每个Car实例都有自己的名称和whee(无论它是什么)。
答案 3 :(得分: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);
}
}