2013-08-02 105 views
2

下面的代碼產生這樣的輸出:這個變量是如何改變的?

AAAB - > AABB - > AB | BB - > 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]};

然後我得到所需的輸出。這是爲什麼發生?

+4

什麼是'abcd'? –

+5

'byte [] present = word;'這並不構成數組的副本 - 這會使'present'引用與'word'相同的數組。 –

+0

我不寫:字=現在,我寫:現在=字。然後現在必須改變,而不是字。 – satiate

回答

4
byte[] present=word; 

簡單地複製引用和任何修改呈現都反映到單詞中:換句話說,寫出現在將對單詞應用相同的修改。 您必須執行System.arraycopy()才能製作深度複製

+1

謝謝。我去讀了關於System.arraycopy並且遇到了另一個版本:'byte [] present = word.clone();' – satiate

7

present設置爲參考wordword中的值未被複制。因此,當您更改present中的值時,確實會更改present「引用」的變量:word

0

看來,禮物是一個指向單詞的指針,這就是它改變它的原因。你可能想通過做這樣的事情來複制它:

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

很遺憾,如果我的Java的壞...我一直在使用JavaScript的整體日誌最近,我可能已經得到了混淆。

+0

我不會真的叫他們*指針*,而是*引用* –

2

因爲數組是一個引用類型的變量。所以當你做

byte[] present=word 

你只是創建一個新的引用到同一個對象。無論如何改變對象當然會反映在所有參考文獻中。 就是這樣。

2

「爲什麼字改變了?」

因爲你改變了!哪裏?在這裏:

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

既然你用=到initlaize present,它refernces到word
而第二行更改了presentword的值。

當第二版本工作?

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

因爲你創造了全新陣列,而不是referncing老之一。

4

,我認爲你是給在這一行的同一個對象的兩個引用:

byte[] present=word; 

你不克隆字對象使用它爲別人的事情。