关于变量:指向对象如何在java中工作?

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, 2, 3}。让一个叫以东十一〔一〕的孩子拿着。现在,您可以告诉子a修改数组中的项,因为子a持有它。

在第二行,你告诉另一个孩子b拿着a拿着的气球,如下:

1
int[] b = a;

现在,ab实际上是拿着同一个气球!

当你这样做的时候:

1
a[1] = 35;

a所持的气球不仅发生了变化,而且b所持的气球也发生了变化。因为,好吧,ab拿着同一个气球。

当你这样做的时候,同样的事情也会发生:

1
b[0] = -5;

这就是Java中引用类型的工作方式。但请注意,这不适用于原始类型,如intfloat

例如,

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引用内存中的引用。

然后,当您创建新的变量int[] b = a;时,您不会将内存分配给该变量b,而是b引用了a引用的相同地址。

现在,当您更改ab中的某些内容时,更改发生在这两个变量引用的地址处,并将由这两个变量反映出来。


因为当设置int[] b = a时,并不是简单地复制a的值并将它们给b的,而是把a的内存位置给b的,因此,如果改变一个,就改变另一个。