这个变量如何变化?

时间:2013-08-02 19:57:35

标签: java arrays variables

以下代码生成此输出:

  

aaab - > aabb - > abbb - > BBBB

我的目标是让它看起来像这样:

  

aaab - > aaba - > abaa - > BAAA

但我很难搞清楚为什么会得到这个结果。

    String abcd = 'abcd';
    int l=3;
    byte[] word=new byte[]{abcd[0],abcd[0],abcd[0],abcd[0]};
    System.out.println(new String(word)); // print: aaaa
    while (l >= 0) {
        byte[] present=word; // !!!
        present[l + 1 - (l - (--l))] = abcd[1];
        System.out.println(new String(present)); // print: aaab -> aabb -> abbb -> bbbb
    }
    System.out.println(new String(word)); // print: bbbb

如果我改变这一行(5):byte[] present=word;

byte[] present=new byte[]{abcd[0],abcd[0],abcd[0],abcd[0]};

然后我得到了所需的输出。为什么会这样?

6 个答案:

答案 0 :(得分:7)

present被设置为引用wordword中的值未被复制。因此,当您更改present中的值时,它实际上正在将present“引用的变量”更改为:word

答案 1 :(得分:4)

byte[] present=word;

简单地复制引用并且对当前的任何修改都反映到单词:换句话说,写入将对单词应用相同的修改。 您必须执行System.arraycopy()以进行深层复制

答案 2 :(得分:4)

我认为你在这一行给出了同一个对象的两个引用:

byte[] present=word;

您不会克隆单词对象以将其用于其他事物。

答案 3 :(得分:2)

因为数组是引用类型变量。所以当你这样做时

byte[] present=word

您只需创建对同一对象的新引用。当然,无论如何改变对象都反映在所有参考文献中。 就是这样。

答案 4 :(得分:2)

  

“为什么单词会改变?”

因为你改变了它!哪里?这里:

byte[] present=word;
present[l + 1 - (l - (--l))] = abcd[1];

由于您使用=来宣传present,因此会引用word
而seconde行会更改presentword的值。

seconde版本有效吗?

byte[] present=new byte[]{abcd[0],abcd[0],abcd[0],abcd[0]};

因为你创建了一个全新的数组,而不是引用旧数组。

答案 5 :(得分:0)

似乎现在是指向单词的指针,这就是它改变它的原因。您可能希望通过执行以下操作来复制它:

byte[] present = new byte[word.length];
for (int i=0;i<word.length;i++) {
  present[i] = word[i];
}

抱歉,如果我的Java很糟糕......我最近一直在使用Javascript整个日志,而且我可能已经混淆了。