проблема назначения массива объектов - PullRequest
1 голос
/ 04 февраля 2011

У меня проблема с тем, что каждый элемент моего массива кажется переназначенным.

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 ]

6 голосов
/ 04 февраля 2011

Это потому, что ваши переменные являются статическими, т.е. они принадлежат классу, а не экземпляру. Взгляните на Учебные руководства по Java | Понимание экземпляров и членов класса для получения дополнительной информации о том, что это значит.

Вы должны удалить ключевое слово static, чтобы они стали переменными экземпляра.

5 голосов
/ 04 февраля 2011

Изменение

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

на

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

static означает, что переменная является общей для всех экземпляров.(Тот факт, что вы можете использовать this для ссылки на статические переменные, является странностью Java.)

0 голосов
/ 04 февраля 2011

Лучший способ структурировать ваш код следующим образом.

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);
    }
}
0 голосов
/ 04 февраля 2011

Ваши поля nom и whee являются статическими.Это означает, что они привязаны к классу, а не к объекту (экземпляру) класса.

Таким образом, когда вы присваиваете this.nom новое значение, в действительности вы присваиваете значение Car.nom.Компилятор позволяет ссылаться на статические переменные через объект, но это очень плохая практика.Вы всегда должны ссылаться на статические поля по их классу: Car.nom, Car.whee.Это проясняет, что nom и whee являются статическими и, таким образом, совместно используются всеми экземплярами класса.В этом случае эти поля не должны быть статичными: каждый экземпляр Car имеет свое имя и имя (независимо от того, каким оно может быть).

...