2016-01-16 72 views
0

所以我有一個代表二維形狀的一維布爾數組。它是從0-8編號,較該指數一個3x3正方形:Java數組通過引用而不是值

012 
345 
678 

我用下面的代碼寫一個函數形狀順時針旋轉:

newShape[2]=oldShape[0]; 
newShape[5]=oldShape[1]; 
newShape[8]=oldShape[2]; 
newShape[1]=oldShape[3]; 
newShape[4]=oldShape[4]; 
newShape[7]=oldShape[5]; 
newShape[0]=oldShape[6]; 
newShape[3]=oldShape[7]; 
newShape[6]=oldShape[8]; 

現在,當的輸入功能:

false-true-false 
true--true-false 
false-false-false 

預期輸出是:

false-true-false 
false-true--true 
false-false-false 

但是,我反而得到:

false-true-false 
true--true--true 
false-true-false 

這不僅是newShape的結果,但也oldShape結果,儘管我從來沒有改變oldShape。似乎這些作業是圍繞着變量的引用而改變的,而不是它們的實際值。我怎樣才能解決這個問題?

+4

'newShape'是如何聲明的? 「oldShape」如何聲明?你在通過什麼方式進出你的方法?給你的問題添加一些實際的代碼會使它更清晰。理想情況下,您甚至可以包含[MCVE](http://stackoverflow.com/help/mcve)。 – azurefrog

+0

如果'newShape'和'oldShape'數組引用指向相同的數組,那麼爲'newShape'中的數組元素賦值將仍然覆蓋'oldShape'數組元素,因爲它們本質上是引用相同的數組。 –

回答

2

看來你對newShape和oldShape都使用了同樣的參考。當然你應該使用不同的數組。我能夠改變你的結果。只需克隆陣列

public class Class { 
    public static void main(String[] args) { 
     boolean[] oldShape = new boolean[]{ 
       false, true, false, 
       true, true, false, 
       false, false, false 
     }; 

     // THIS DOENS TWORK 
     boolean[] newShape = oldShape; 

     //THIS WILL WORK 
//  boolean[] newShape = new boolean[9]; 

     output(oldShape); 

     newShape[2] = oldShape[0]; 
     newShape[5] = oldShape[1]; 
     newShape[8] = oldShape[2]; 
     newShape[1] = oldShape[3]; 
     newShape[4] = oldShape[4]; 
     newShape[7] = oldShape[5]; 
     newShape[0] = oldShape[6]; 
     newShape[3] = oldShape[7]; 
     newShape[6] = oldShape[8]; 

     output(newShape); 
    } 

    private static void output(boolean[] s) { 
     for (int i = 0; i < 3; ++i) { 
      for (int j = 0; j < 3; ++j) { 
       System.out.print(s[i*3+j] + " "); 
      } 
      System.out.println(); 
     } 
     System.out.println(); 
    } 
} 
相關問題