Java 传递现有数组与传递包含该数组中元素的新数组的结果不同

Java 传递现有数组与传递包含该数组中元素的新数组的结果不同,java,android,arrays,Java,Android,Arrays,我正在为Android编写一个游戏。游戏元素的颜色是通过存储RGBA值的ColorTheme对象设置的。 在初始化例如三角形时,将从ColorTheme对象中获取RGBA值的数组传递给构造函数。 虽然ColorTheme对象中的颜色在初始化后从未更改,但三角形的颜色确实更改。我在想原因。 我注意到,如果我从ColorTheme数组中传递一个包含元素的新数组,而不是将ColorTheme对象本身传递给Triangle构造函数,它的工作方式就像我想要的那样。这真的不重要,因为Java中没有指针(对吧

我正在为Android编写一个游戏。游戏元素的颜色是通过存储RGBA值的ColorTheme对象设置的。 在初始化例如三角形时,将从ColorTheme对象中获取RGBA值的数组传递给构造函数。 虽然ColorTheme对象中的颜色在初始化后从未更改,但三角形的颜色确实更改。我在想原因。 我注意到,如果我从ColorTheme数组中传递一个包含元素的新数组,而不是将ColorTheme对象本身传递给Triangle构造函数,它的工作方式就像我想要的那样。这真的不重要,因为Java中没有指针(对吧?)


指针本身并不存在,但仍然存在对象引用,它们的行为类似于指针(除了它们不允许指针算术)。这意味着两者之间存在着巨大的差异

new Blah(x);

每次,如果这些是我们正在讨论的对象,它们都会通过引用传递。这意味着,如果
Blah
的构造函数决定对传递给它的对象进行修改,那么第一个对象最终将被修改
x
,但第二个不会,因为只有副本会被修改

底线是,如果您有一个不想弄乱的数组,并且要将其传递给可能修改给定数组的代码,那么您需要传递一个克隆而不是原始数组

如果您有一个基元数组(比如一个
int[]
),您可以使用

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

得到一个克隆人。请注意,如果数组的元素本身是对象,那么这将为您提供一个浅拷贝(然后您需要查找浅拷贝和深拷贝之间的差异)。

Java数组,甚至原语数组,都是
对象。因此,如果不传递副本(使用方法或其中一种方法),则对原始引用的更改将修改
对象的引用

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