This question already has answers here:
Is Java “pass-by-reference” or “pass-by-value”?

(87个答案)


3年前关闭。




这是我的代码:


文件A.java


package test;

import java.util.Arrays;

public class A {

    static int[] test;

    public static void main(String... args) {

        test = new int[2];
        B.function(test);
        System.out.println(Arrays.toString(test));
    }
}



文件B.java


package test;

public class B {
    static int[] function(int[] array){
        array[0] = 1;
        array[1] = 2;

        return array;
    }
}



输出:[1,2]


我无法理解代码的工作原理。我将一个名为“ test”的变量传递给一个参数为int []的函数,据我所知,参数被视为局部变量。那么,对局部变量所做的更改如何反映在实际传递的变量中?

最佳答案

那么对局部变量所做的更改如何反映在实际
传递变量?


参考变量存储在本地(在每个运行的thread不同的堆栈内存中),但是所有对象(由参考变量引用)由JVM管理在堆内存中。

因此,在您的情况下,array(引用变量)是function方法的局部变量,但是数组引用的实际对象在堆内存中。

例如,int[] a = new int[10];

这将创建由变量a引用的数组对象(在堆中)(局部于方法或块)。当您将a传递给其他方法时,将创建引用变量的副本,但该副本也引用同一数组对象。当您使用第二个引用变量修改任何内容时,它将更改堆上的同一对象。

为了简单理解,您可以这样想,一个对象是一台电视机,其中参考变量是遥控器,因此当您使用遥控器进行任何操作(即使用参考变量)时,它将控制同一台电视机(同一对象)。

07-26 06:37
查看更多