This question already has answers here:
Is Java “pass-by-reference” or “pass-by-value”?
(87个答案)
3年前关闭。
这是我的代码:
文件A.java
文件B.java
输出:[1,2]
我无法理解代码的工作原理。我将一个名为“ test”的变量传递给一个参数为int []的函数,据我所知,参数被视为局部变量。那么,对局部变量所做的更改如何反映在实际传递的变量中?
(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
传递给其他方法时,将创建引用变量的副本,但该副本也引用同一数组对象。当您使用第二个引用变量修改任何内容时,它将更改堆上的同一对象。
为了简单理解,您可以这样想,一个对象是一台电视机,其中参考变量是遥控器,因此当您使用遥控器进行任何操作(即使用参考变量)时,它将控制同一台电视机(同一对象)。