我正在为Android编写游戏。游戏元素的颜色通过存储RGBA值的ColorTheme对象设置。 在例如初始化时一个三角形,一个ColorTheme对象中带有RGBA值的数组被传递给构造函数。 虽然ColorTheme-Object中的颜色在初始化后永远不会改变,但三角形的颜色确实如此。我想弄明白为什么。 我注意到,如果我使用ColorTheme-Array中的元素传递一个新数组而不是将ColorTheme对象本身传递给Triangle构造函数,它就像我想要的那样。这真的不重要,因为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);
}
答案 0 :(得分:3)
没有指针本身这样的东西,但仍有对象引用,它们就像指针一样(除了它们不允许指针算术) 。这意味着
之间存在着世界上的所有差异new Blah(x);
和
new Blah(copyOfX);
每次,如果这些是我们正在谈论的对象,它们就会通过引用传递。这意味着如果Blah
的构造函数决定对传递给它的对象进行修改,那么第一个将最终修改x
,但第二个会赢得#t} ,因为只会修改副本。
最重要的是,如果你有一个你不想搞砸的数组,并且你将它传递给可能修改它给出的数组的代码,你想要传递一个克隆而不是比原来的。
如果您有一系列基元(比如int[]
),您可以使用
int[] copyOfX = Arrays.copyOf(x, x.length);
获得克隆。请注意,如果数组的元素本身就是对象,那么这将为您提供浅拷贝(然后您需要查找浅拷贝和深拷贝之间的区别)
答案 1 :(得分:1)
Java数组,甚至是基元数组,都是Object
。因此,如果您未通过副本(使用您的方法或Arrays.copyOf()
方法之一),则对原始引用的更改将修改您的Object
参考