How does pointing to objects work in java?
所以,假设我有两个这样定义的数组:
1 2 3 4 5 | 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(它们是可互换的)吗?
我对这个概念感到困惑,希望能澄清一下。任何建议都将不胜感激。谢谢。
因为Java数组被认为是引用对象。
1 | int[] b = a; // variable 'b' points same memory location with 'a' |
如果要复制a的所有值,请在下面编写代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | @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("]"); } |
我们来做个类比。您创建的对象(如数组)类似于气球。变量(A和B)就像孩子一样。孩子们可以用绳子拿一个气球。这个字符串就是我们所说的引用。另一方面,一个气球可以由多个孩子抱着。
在代码中,您创建了一个气球,即数组
在第二行,你告诉另一个孩子
1 | int[] b = a; |
现在,
当你这样做的时候:
1 | a[1] = 35; |
当你这样做的时候,同样的事情也会发生:
1 | b[0] = -5; |
这就是Java中引用类型的工作方式。但请注意,这不适用于原始类型,如
例如,
1 2 3 | int a = 10; int b = a; b = 20; //a is not equal to 20!!! |
当您创建变量EDCOX1 OR 5时,通过使用括号{},就像说EDCOX1(6)那样,Java为这些值分配足够的内存,现在EDCOX1 1引用内存中的引用。
然后,当您创建新的变量
现在,当您更改
因为当设置