在 Java 中数组是以值传递还是以引用传递
本教程介绍了在 Java 中按值或引用传递的数组。
当我们调用一个方法时,它的参数可以作为值或引用传递。在讨论这两个问题之前,让我们先了解两个术语:
- callee:这是另一个方法调用的方法
- caller:这是调用另一个方法的方法
现在让我们了解什么是按值传递和按引用传递。
什么是 Java 中的按值传递
当我们说参数是按值传递时,实际参数的值在内存中被复制了。
调用者和被调用者维护两个具有相同值的自变量。如果被调用者修改了参数值,我们看不到调用者的变化。
要点:
- 被调用者无权访问调用代码中的原始元素。
- 将数据(参数值)的副本发送给被调用者。
- 对传递变量的更改不会影响最终值。
什么是 Java 中的按引用传递
当我们说参数通过引用传递(也称为按地址传递)时,它意味着将调用函数中的参数的引用传递给相应的形参。
在这种情况下,会制作实际参数地址的副本。调用者和被调用者对参数使用相同的变量,因此,如果被调用者修改参数变量,我们可以看到调用者变量的变化。
要点:
- 被调用者引用调用代码中的编程元素。
- 传递存储数据的内存地址而不是值。
- 对值的任何更改都会影响原始数据
Java 是按值传递的
与 C++ 不同,在 Java 中,我们只能将参数作为值传递。但是有一个问题:当对象作为参数传递时,它们的引用作为值传递给被调用者。
换句话说,即使 Java 严格按值传递,它的行为与对象的引用传递一样。让我们用一些例子来更好地理解这个概念。
在 Java 中传递原始数据类型
在下面的代码中,我们将两个整数作为参数传递给函数,然后我们更改它们的值。
由于在 Java 中参数是按值传递的,因此该函数维护了一个单独的参数副本。我们对参数所做的任何更改都只在函数副本中进行,而不是在主函数(调用者)维护的副本中。
因此,我们在函数调用完成后打印值时得到原始值。看下面的示例代码:
public class SimpleTesting {
static void JE_function(int n1, int n2) {
n1 = -232;
n2 = -90;
}
public static void main(String args[]) {
int JE_numa = 6932;
int JE_numb = 8934;
System.out.println("Numbers before function call :" + JE_numa + " and " + JE_numb);
JE_function(JE_numa, JE_numb);
System.out.println("Numbers after the JE_function call :" + JE_numa + " and " + JE_numb);
}
}
输出:
Numbers before function call:6932 and 8934
Numbers after the JE_function call:6932 and 8934
在 Java 中传递数组
当涉及到对象时,对对象的引用是通过值作为参数传递的。
在下面的代码中,我们传递一个数组作为参数,当我们打印对象(数组)的值时,会打印一个内存位置。这与对象变量存储存储对象的内存位置有关。
看下面的示例代码:
public class SimpleTesting {
static void JE_function(String[] sentence) {
System.out.println(sentence);
}
public static void main(String args[]) {
String[] sent = {"I", "Love", "Delftstack"};
JE_function(sent);
}
}
输出:
[Ljava.lang.String;@442d9b6e
使用上面的代码,我们尝试传达对作为参数传递的数组的引用。因此,如果我们更改数组的值(不是内存位置),更改将反映在被调用方中。
看下面的示例代码:
public class SimpleTesting {
static void JE_function(String[] sentence) {
sentence[1] = "Visit";
}
public static void main(String args[]) {
String[] sent = {"I", "Love", "Delftstack"};
System.out.println("Sentence before calling the function");
for (String word : sent) {
System.out.println(word);
}
JE_function(sent);
System.out.println("Sentence after calling the function");
for (String word : sent) {
System.out.println(word);
}
}
}
输出:
Sentence before calling the function
I
Love
Delftstack
Sentence after calling the function
I
Visit
Delftstack
从上面的代码可以看出,对数组的任何更改都会反映在主块中。
把它想象成两个朋友正在做一个项目。朋友所做的任何工作都会反映在整个项目中。
在这种情况下,该函数引用主块使用的相同数组。