静态对象数组在cicle之后获得相同的值

时间:2015-06-29 20:42:07

标签: java

我正在测试此代码的结果,以实现静态对象创建的工作原理。 基本上我理解了所有内容直到最后 System.out.println("" + a [0]); 我运行了调试器,我在那一点上验证了所有的数组的元素在 num 变量上具有相同的值。 谁能解释我为什么会这样?

static class Numero {

    private static int sn = 0;
    private int num;

    public Numero(int n) {
        num = n;
        ++sn;
    }

    public void setNum(int n) {
        num = n;
    }

    public String toString() {
        return "num = " + num + " sn = " + sn;
    }
}

public static void main(String[] args) {

    Numero[] a = new Numero[3];
    Numero x = new Numero(12);

    for (int i = 0; i < a.length; i++) {
        a[i] = x;
        a[i].setNum(i);
        System.out.println("  " + a[i]);
    }
    System.out.println("  " + a[0]);
}

输出:

  num = 0 sn = 1
  num = 1 sn = 1
  num = 2 sn = 1
  num = 2 sn = 1

4 个答案:

答案 0 :(得分:1)

这是因为您的Numero对象是可变的。当您以任何方式修改它时,也会修改对它的所有引用。

当您拨打[i] = x:

  • 没有创建x的副本并将其放在i位置。
  • 执行在位置i存储对x的引用。

因此,在迭代结束时,您的数组已存储了对同一对象的三个引用(您可以将其视为{x,x,x})。并且因为该对象在整个循环中已经改变(因为a [i] .setNum(i)等于x.setNum(i)),所以最后一个输出将num值打印为2。

答案 1 :(得分:1)

您创建了一个Numero,因此sn增加了一次,为1.同一个实例已分配给a的每个元素;您看到了num的不同值,因为您在不同时间将其打印出来。

答案 2 :(得分:1)

创建静态类本质上强制执行单例设计模式。该类只能有静态方法和静态实例字段。静态实例字段在类的所有实例中保持相同的值,您可以将其视为该类的所有对象共享相同的变量而不是具有它的副本。

当你在循环中打印a[0]时,你会得到你所期望的,但是在循环之后,那个静态(&#34;共享&#34;)变量被其他对象改变了,留下num是值2,由for循环的最后一次迭代设置。

答案 3 :(得分:1)

问题就在这里

a [i] = x;

a [i]现在指向X,所以无论何时调用setNum方法,方法都属于X。所以你总是得到相同的实例输出