传递现有数组会产生与传递具有该数组之外的元素的新数组不同的结果

时间:2014-10-04 11:24:41

标签: java android arrays

我正在为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);
}

2 个答案:

答案 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参考