对象数组赋值问题

时间:2011-02-04 13:38:52

标签: java arrays object variable-assignment

我有一个问题,我的数组的每个元素似乎都被重新分配。

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

4 个答案:

答案 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);
    }
}