【问题标题】:object array assignment problem对象数组赋值问题
【发布时间】:2011-06-21 09:05:56
【问题描述】:

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

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

【问题讨论】:

  • 欢迎来到 StackOverflow。当您提出问题时,右侧有一个方便的如何格式化框。值得一读,就像问题区域上方 [?] 中的the page linked 一样。当您编写 questino 时,会在文本框下方预览它的外观。

标签: java arrays object variable-assignment


【解决方案1】:

以下是构建代码的更好方法。

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

【讨论】:

    【解决方案2】:

    您的 nom 和 whee 字段是静态的。这意味着它们与类相关联,而不是与类的对象(实例)相关联。

    因此,当您为 this.nom 分配一个新值时,实际上,您为 Car.nom 分配了一个值。编译器允许通过对象引用静态变量,但这是非常糟糕的做法。您应该始终按类引用静态字段:Car.nom、Car.whee。这清楚地表明 nom 和 whee 是静态的,因此由类的所有实例共享。在这种情况下,这些字段不应该是静态的:每个 Car 实例都有自己的名称和 whee(无论它是什么)。

    【讨论】:

      【解决方案3】:

      改变

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

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

      static 表示该变量由所有实例共享。 (您可以使用this 来引用静态变量这一事实是Java 的怪事。)

      【讨论】:

      • 通常,不要在构造函数中设置静态字段。尝试制作字段final。这可以帮助您避免许多错误。
      • @Peter:是的,非常很好的规则。但在这种情况下,我认为他无论如何都不希望它们成为静态的,所以......
      • 每当我看到在构造函数中设置的静态字段时,它都是错误或混乱的根源。 ;)
      【解决方案4】:

      这是因为您的变量是静态的,即它们属于类,而不是实例。请查看Java Tutorials | Understanding Instance and Class Members,了解有关这意味着什么的更多信息。

      您应该删除static 关键字,以便它们成为实例变量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多