有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:为什么在一个函数中更改数组的地址,在我们从该函数返回时不更改它的地址?

我的意思是,当我们从该函数返回时,数组的地址仍然与我们进入该函数之前的地址相同。 举个例子:

 class sdasd {
     public static void main(String[] args){
            int[] obj = new int [7];
            //obj has an address
            sdasd t = new sdasd();
            t.func(obj);
            //obj has the same address as before!!
            }
     void func(int[] obj){
        int[] otherObj = new int[13];
        obj=otherObj;``
        //we changed the address of the array 'obj'?
        }
   }

谢谢你的帮助


共 (2) 个答案

  1. # 1 楼答案

    这是因为对obj引用通过值传递到func。因此,在方法func中,您已将本地引用更改为新数组,但main的obj仍然引用原始数组。在Java中,数组也是对象,所以数组被声明为引用,就像普通对象一样

  2. # 2 楼答案

    在被调用的函数中obj是数组引用的副本。所以,当你输入func时,你有什么可以描述为

      main::obj  > int[7];
      func::obj  > int[7];
    

    分配新数组后,您将

      main::obj  > int[7];
      func::obj  > int[13];
    

    参数是按值传递的,因此会创建参数的副本。当它是参考时,参考的副本指向原始对象;对引用的更改是该方法的本地更改(但对对象本身的更改由所有引用共享!)

    把最后一点说清楚,如果你已经这样做了,而不是指定一个新的参考,比如

     void func(int[] obj) {
         obj[1] = 69;
     }
    

    然后,可以从main::obj看到更改