【问题标题】:How does pointing to objects work in java?指向对象如何在java中工作?
【发布时间】:2016-02-18 04:41:44
【问题描述】:

所以,假设我有 2 个这样定义的数组:

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 指向 一个)。但是,如果我更改 b 中的值,为什么会影响 a?那岂不是好像 a 指向 b (它们是可以互换的)?

我对这个概念感到困惑,希望得到一些澄清。 任何意见,将不胜感激。谢谢。

【问题讨论】:

  • 在您的代码中,ab 是对相同内存位置的引用。
  • 这可能对你有帮助:stackoverflow.com/a/1750197/3226981
  • ab 都指向同一个对象,该对象在内存中的某处 else 关闭。 b 不是指向a,它指向的是a 指向的同一个对象。

标签: java variables pointers reference


【解决方案1】:

我们在这里做一个类比。您创建的对象(例如数组)就像气球一样。变量(a 和 b)就像孩子一样。孩子们可以用一根绳子拿着一个气球。而那个字符串就是我们所说的reference。另一方面,一个气球可以由多个孩子拿着。

在您的代码中,您创建了一个气球,即一个数组 {1, 2, 3}。让一个叫a的孩子拿着它。现在您可以告诉子 a 修改数组中的项目,因为子 a 正在持有它。

在第二行中,您告诉另一个孩子 b 拿着 a 拿着的气球,像这样:

int[] b = a;

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

当你这样做时:

a[1] = 35;

不仅a持有的气球被改变了,b持有的气球也被改变了。因为,好吧,ab 拿着相同的气球。

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

b[0] = -5;

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

例如,

int a = 10;
int b = a;
b = 20; //a is not equal to 20!!!

【讨论】:

  • 谢谢大家的回答。
【解决方案2】:

当您创建变量int[] a = {1,2,3}; 时,使用方括号{ } 就像说new int[n] 一样,java 会为这些值分配足够的内存,现在a 会在内存中引用该地址。

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

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

【讨论】:

    【解决方案3】:

    因为 Java Array 被认为是引用对象。

    int[] b = a;    // variable 'b' points same memory location with 'a'
    

    如果要复制 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("]");
    }
    

    【讨论】:

      【解决方案4】:

      因为当您设置int[] b = a 时,您并没有简单地将a 的值复制到b,而是将b 的内存位置给a,因此如果您更改一个,您换一个

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 2022-10-03
        • 2013-02-03
        • 2023-01-03
        • 2018-01-02
        • 1970-01-01
        相关资源
        最近更新 更多