2014-10-04 55 views
3

我正在爲Android設計一款遊戲。通過存儲RGBA值的ColorTheme對象設置遊戲元素的顏色。 在初始化例如ColorTheme對象之外的RGBA值的三角形被傳遞給構造函數。 儘管ColorTheme-Object中的顏色在初始化後不會改變,但三角形的顏色確實如此。我試圖找出原因。 我注意到它可以像我想要的那樣工作,如果我使用ColorTheme數組中的元素傳遞一個新數組而不是將ColorTheme對象本身傳遞給三角形構造函數。這真的沒有關係,因爲沒有Java中的指針(對吧?)。傳遞現有數組給出的結果不同於傳遞具有數組元素的新數組

@Override 
public void onSurfaceChanged(GL10 gl10, int width, int height) { 

//... 

mThemes = new ColorTheme[]{ 
      new ColorTheme(
        new float[]{0.20f, 0.71f, 0.91f, 1.00f}, // blue circle 
        new float[]{1.00f, 1.00f, 1.00f, 1.00f}, // white obstacle 
        new float[]{1.00f, 1.00f, 1.00f, 1.00f}, // white triangle 
        new float[]{0.00f, 0.60f, 0.80f, 1.00f}  // shadow 
      ), 
      new ColorTheme(
        new float[]{0.27f, 0.40f, 0.80f, 1.00f}, // purple circle 
        new float[]{1.00f, 1.00f, 1.00f, 1.00f}, // white obstacle 
        new float[]{1.00f, 1.00f, 1.00f, 1.00f}, // white triangle 
        new float[]{0.60f, 0.20f, 0.80f, 1.00f}  // shadow 
      ), 
      new ColorTheme(
        new float[]{0.60f, 0.80f, 0.00f, 1.00f}, // green circle 
        new float[]{1.00f, 1.00f, 1.00f, 1.00f}, // white obstacle 
        new float[]{1.00f, 1.00f, 1.00f, 1.00f}, // white triangle 
        new float[]{0.40f, 0.60f, 0.00f, 1.00f}  // shadow 
      ) 
    }; 

//... 

// Values keep changing after initialization like this  
mShadowTriangle = new Triangle(mScreenRatio, mThemes[outerThemeIndex].theme[3],true); 

// They don't like this 
mShadowTriangle = new Triangle(mScreenRatio, new float[]{mThemes[outerThemeIndex].theme[3][0],mThemes[outerThemeIndex].theme[3][1],mThemes[outerThemeIndex].theme[3][2],mThemes[outerThemeIndex].theme[3][3]},true); 
} 

回答

3

有沒有這樣的事,作爲一個指針本身,但仍有對象引用,他們看上去是指針(只是它們不允許指針運算)。這意味着,有世界上所有的

new Blah(x); 

new Blah(copyOfX); 

每次之間的區別,如果這些都是我們正在談論,他們得到的引用傳遞對象。這意味着如果Blah的構造函數決定對傳遞給它的對象進行修改,那麼第一個將被修改爲x,但第二個不會,因爲只有該副本會被修改。

底線是,如果你有一個你不想搞混的數組,並且你將它傳遞給可能修改它給出的數組的代碼,你想要傳遞一個克隆而不是原始數據。

如果你有基元的數組(說的int[]),你可以使用

int[] copyOfX = Arrays.copyOf(x, x.length); 

獲得克隆。請注意,如果數組的元素本身就是對象,那麼這會給你一個淺拷貝(然後你需要查看淺拷貝和深拷貝之間的區別)。

1

Java數組,甚至是基元數組,都是Object s。因此,如果您未通過複印件(使用您的方法或Arrays.copyOf()方法之一),那麼對原始參考文件的更改將修改您的Object的參考文獻。