public class example
{
public static void main(String[] args)
{
int[] MyArray = new int[10];
MyArray[1] = 5;
int[] NewArray = MyArray;
NewArray[1] = 10;
System.out.println(MyArray[1]);
}
}
为什么系统会打印10
而不是5
?
似乎我们对NewArray
中的元素所做的任何更改,MyArray
都会改变,为什么?
我复制这个模式以启动类似int,字符串变量,但它们不像上面那样表现,为什么?谢谢你,我是CS编程的新手。
答案 0 :(得分:8)
似乎我们对NewArray中的元素所做的任何更改,MyArray都会改变,为什么?
你没有改变NewArray
。您正在更改NewArray
的值所引用的数组。它是这样的:
NewArray
是一个变量(非常规命名,但是嘿)NewArray
的值是参考区分变量,引用和对象真的非常重要。不要担心它不会立刻来找你 - 这是很多人第一次遇到像Java这样的语言时所经历的阶段。
MyArray
和NewArray
的值都指向同一个数组,因此如果您通过一个变量对数组进行更改,那么当您仍然看到更改时然后查看数组 via 一个不同的变量。
我复制这个模式以启动类似int,字符串变量,但它们不像上面那样表现,为什么?谢谢你,我是CS编程的新手。
对于int
,这是一个值类型 - int
变量的值是数字本身,而不是对象的引用。
对于String
,我怀疑您正在更改变量的值以引用不同的String
对象 - 而不是更改String
的内容对象本身(你可以' t - 字符串在Java中是不可变的)。例如:
String x = "first";
String y = x;
x = "second"; // This doesn't change the value of `y`
我喜欢将变量视为纸张。对于值类型变量,该值只写在纸上:
int i = 10;
就像有一张名为i
的纸张,上面的值为10。
对于类和数组(引用类型),纸上的值不是对象 - 它是导航到对象的一种方式。有点像在一张纸上写下某人的家庭住址。
假设您有两张纸,上面写有相同的地址。如果你把它们中的一个擦掉并写一个不同的地址,那么如果有人看着其他那张纸然后去那个房子会发生什么事情,这并没有什么改变。这就像上面的String
示例。
然而,数组示例更像是这样:我在两张纸上写下我的家庭住址,并将它们交给Fred和Ginger。弗雷德读取地址,访问我家,并将前门涂成红色。 (他正在修改对象 - 我的房子 - 根本没有改变他的那张纸。)现在,如果Ginger在他的纸上阅读地址并访问我的家,他会看到一个红色的前门。
答案 1 :(得分:1)
发生这种情况的原因是,当您说int[] NewArray = MyArray;
时,这会将MyArray
的引用复制到NewArray
。
这是您复制引用的原因是因为您不调用new
运算符来实例化一个新数组。
因此,当您说NewArray[x]
时,它指向x
内存中的MyArray
位置(因此MyArray
的内存中的值)。执行int[] NewArray = MyArray;
时未分配新内存,因为未调用new
运算符。
答案 2 :(得分:1)
当你做=时,这是因为这使得新的obkect指向旧的obkect。因此,对新版本所做的任何更改都将反映在旧版本中,因为它们在技术上是相同的。 你应该使用array.clone来避免这种情况。
答案 3 :(得分:1)
你没有复制它的价值。你说:
Java create" MyArray"。 Java创建一个变量poiting at object
Java创建另一个数组" NewArray"这与MyArray相同
Java创建一个与MyArray
在同一对象上的变量Java将NewArray [1]的值更改为10
Java会更改它所针对的对象的值,而不是变量本身。
希望你明白。 作为旁注,您应该使用[0]而不是[1]。数组从0开始,就像编程中的所有内容一样。因此,您创建的10个项目的数组从0开始,到9结束。请注意。