因此,假设我有两个数组定义如下:
int[] a = {1,2,3};
int[] b = a;
a[1] = 35; // b[1] becomes 35
b[0] = -5; // why would a[0] become -5?因此,我可以推断,更改a中的值会自动更改b (b指向a)中的值。但是,如果我改变了b中的值,它为什么会影响a?这难道不像a指向b(它们是可互换的)吗?
我对这一概念感到困惑,希望得到一些澄清。如有任何建议,将不胜感激。谢谢。
发布于 2016-02-18 05:06:10
我们来做个类比吧。您创建的对象(如数组)就像气球一样。变量(a和b)就像孩子一样。孩子们可以拿着一个带绳子的气球。这个字符串就是我们所说的引用。另一方面,一个气球可以由多个孩子持有。
在代码中,您创建了一个气球,即数组{1, 2, 3}。让一个叫a的孩子抱着它。现在,您可以告诉子a修改数组中的项,因为子a持有它。
在第二行中,您告诉另一个子b持有a持有的气球,如下所示:
int[] b = a;现在a和b实际上持有相同的气球!
当你这样做时:
a[1] = 35;a持有的气球不仅改变了,b持有的气球也改变了。因为a和b拿着同样的气球。
当你这样做时,也会发生同样的事情:
b[0] = -5;这就是Java中引用类型的工作方式。但请注意,这不适用于原语类型,如int或float。
例如,
int a = 10;
int b = a;
b = 20; //a is not equal to 20!!!发布于 2016-02-18 04:51:28
在创建变量int[] a = {1,2,3};时,可以使用括号{},就像new int[n] java为这些值分配足够的内存,现在使用内存中的地址的a引用。
然后,当您创建新变量int[] b = a;时,并不是将内存分配给该变量b,而是b引用了a引用的相同地址。
现在,当您在a或b中更改某些内容时,更改将发生在这两个变量引用的地址上,并将由两个变量反映出来。
发布于 2016-02-18 05:07:21
因为Java被认为是引用对象。
int[] b = a; // variable 'b' points same memory location with 'a'如果要复制所有值,请在下面编写代码
@Test
public void arrayCopy1() {
int[] a = {1, 2, 3};
int[] b = a;
System.out.println(a); //Point [I@64a294a6
System.out.println(b); //Point [I@64a294a6
printArrayValues(a); //[1,2,3]
printArrayValues(b); //[1,2,3]
a[0] = 10;
printArrayValues(a); //[10,2,3]
printArrayValues(b); //[10,2,3]
}
@Test
public void arrayCopy2() {
int[] a = {1, 2, 3};
int[] b = Arrays.copyOf(a, a.length);
System.out.println(a); //Point [I@64a294a6
System.out.println(b); //Point [I@7e0b37bc
printArrayValues(a); //[1,2,3]
printArrayValues(b); //[1,2,3]
a[0] = 10;
printArrayValues(a); //[10,2,3]
printArrayValues(b); //[1,2,3]
}
private void printArrayValues(int[] arr) {
System.out.print("[");
for(int i = 0 ; i < arr.length ; i++) {
System.out.print(arr[i]);
if (i != arr.length-1)
System.out.print(",");
}
System.out.println("]");
}https://stackoverflow.com/questions/35473009
复制相似问题