Java 不同的按引用传递的方式
对于初学者程序员,尤其是那些之前已经使用过 C 和 C++ 的人来说,最常问的问题之一就是 Java 是否支持按引用传递(pass-by-reference)还是按值传递(pass-by-value)。通常,编程语言使用按值传递和按引用传递的方式将参数传递给方法。然而,Java 并不支持这两种方式,而是使用按值传递方式来传递原始类型和引用类型的值。但是,Java 提供了一些实现按引用传递的方式,本文将通过这篇文章来探讨这些方式。
实现按引用传递的方式
让我们从了解 Java 的存储机制开始讨论。引用变量、方法和类名都被存储在栈内存中,而它们的值则存储在堆内存中。但是,原始类型的值则直接存储在栈内存中。
正如前面所解释的,Java 只支持对原始类型和引用类型的按值传递,这意味着当调用一个方法时,每个参数的值都会被传递给该方法。
对于原始类型 ,如 int、double 和 Boolean,参数的值与变量的原始值相同。例如,如果我们有一个值为 10 的变量 ‘x’,并将 ‘x’ 作为参数传递给一个方法,那么该方法得到的参数值是原始值 10 的副本。
方法
- 定义一个名为 ‘changeVal()’ 的自定义方法来修改基本类型。
-
在 ‘main()’ 方法中,声明并初始化一个整数类型的变量。
-
现在,调用自定义方法来执行操作并退出。
示例1
下面的示例展示了 Java 中的按值传递。
import java.util.*;
public class ParameterPassing {
public static void changeVal(int n) {
n = n * 2; // modifying value
System.out.println("Inside method: n = " + n);
}
public static void main(String[] args) {
int val1 = 10;
System.out.println("Before calling changeVal method: val1 = " + val1);
changeVal(val1); // calling the method
System.out.println("After calling changeVal method: val1 = " + val1);
}
}
输出
Before calling changeVal method: val1 = 10
Inside method: n = 20
After calling changeVal method: val1 = 10
正如您在输出中所看到的,对于基本类型’val1’,在调用 ‘changeVal’ 方法后,其值不会改变。
通过传值处理按引用传递
由于引用变量存储在堆栈中,因此对于数组、对象和字符串等引用类型,参数的值是给定变量的引用或地址。例如,如果我们有一个元素为{1, 2, 3}的数组’arr’,并且我们将’arr’作为参数传递给一个方法,那么该方法将接收到’arr’的引用或地址的副本作为其参数。
方法
- 定义一个名为’changeArray()’的自定义方法来修改引用类型。
-
在main()方法中声明一个引用类型变量。
-
现在,调用用户定义的方法执行操作并退出。
示例2
下面的示例演示了按引用传递。
import java.util.*;
public class ParameterPassing {
public static void changeAray(int[] a) {
a[0] = a[0] * 2; // modifying value
System.out.println("Inside method: a = " + Arrays.toString(a));
}
public static void main(String[] args) {
int[] aray = {1, 2, 3};
System.out.println("Before calling changeAray method: arr = " + Arrays.toString(aray));
changeAray(aray); // calling the method
System.out.println("After calling changeAray method: arr = " + Arrays.toString(aray));
}
}
输出
Before calling changeAray method: arr = [1, 2, 3]
Inside method: a = [2, 2, 3]
After calling changeAray method: arr = [2, 2, 3]
上述输出显示,对于引用类型“arr”,在调用“changeArray”方法后其值确实发生了变化。
将修改后的值存回原始变量
这种方法将解释我们如何实现对原始变量的引用传递。我们可以通过将修改后的值存回原始值来实现这一点。首先,我们将声明并初始化一个变量。然后,定义一个返回类型的方法来修改其值。最后,调用该方法并将其返回值存回原始变量。这将导致值的成功更改。
示例3
以下示例演示了上述方法。
public class ParameterPassing {
public static int changeVal(int nums) {
return nums = nums * 2; // modifying value
}
public static void main(String[] args) {
int val1 = 10;
System.out.println("Before calling changeVal method: val1 = " + val1);
int newNums = changeVal(val1); // calling the method
val1 = newNums; // storing modified value
System.out.println("After calling changeVal method: val1 = " + val1);
}
}
输出
Before calling changeVal method: val1 = 10
After calling changeVal method: val1 = 20
结论
将引用类型值作为参数传递的方式与原始类型有所不同。在本文中,我们通过示例程序学习了实现原始类型和引用类型变量的传递引用的不同方法。