Java中实现按引用传递的几种方法
初学者程序员,特别是那些过去已经使用过C和C++的程序员,最常问的问题是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”的引用或地址的副本作为其参数。
方法
定义一个名为“changeAray()”的用户定义方法来修改引用类型。
在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”,在调用“changeAray”方法后,其值确实发生了变化。
Learn Java in-depth with real-world projects through our Java certification course. Enroll and become a certified expert to boost your career.
将修改后的值存储回原始变量
这种方法将解释如何实现原始变量的按引用传递。我们可以通过将修改后的值存储回原始值来实现这一点。首先,我们将声明并初始化一个变量。然后,定义一个返回类型的方法来修改其值。最后,调用该方法并将返回值存储回原始变量。这将导致值成功更改。
示例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
结论
将引用类型值作为参数传递与原始类型不同。在本文中,我们通过示例程序学习了实现原始类型和引用类型变量按引用传递的不同方法。