Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:为什么要更改数组';函数中的地址,当我们从该函数返回时是否会更改其地址?_Java_Arrays_Function_Memory Address - Fatal编程技术网

Java:为什么要更改数组';函数中的地址,当我们从该函数返回时是否会更改其地址?

Java:为什么要更改数组';函数中的地址,当我们从该函数返回时是否会更改其地址?,java,arrays,function,memory-address,Java,Arrays,Function,Memory Address,我的意思是,当我们从该函数返回时,数组的地址与我们进入该函数之前的地址相同。 例如: 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

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

 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'?
        }
   }

感谢您的帮助

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

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

在调用的函数中
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
看到更改
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

  • 这是因为当您将obj数组传递给func()时,它实际上创建了 数组“obj”的一个副本,然后将其作为参数传递

    因此,对副本的任何更改都不会影响您的原始“obj”

      • 这是因为当您将obj数组传递给func()时,它实际上创建了 数组“obj”的一个副本,然后将其作为参数传递

        因此,对副本的任何更改都不会影响您的原始“obj”


      您试图更改值的值,因为它是传递值。您试图更改值的值,因为它是传递值。