Java函数的形参传递——值传递与引用传递
在Java中,函数的形参传递方式可以分为值传递和引用传递两种。
值传递是指将实参的值复制给形参,即在函数调用过程中,对形参的任何修改都不会影响实参的值。在值传递的情况下,函数内部对形参的操作不会影响到外部的变量。
引用传递是指将实参的引用(内存地址)复制给形参,形参和实参指向同一块内存地址。在引用传递的情况下,函数内部对形参的修改会影响到外部的变量。
在Java中,对于基本数据类型(如int、float、boolean等),函数的形参传递方式是值传递。这是因为基本数据类型的变量存储的是值本身,而不是内存地址。当我们将一个基本数据类型的变量作为实参传递给函数时,函数会创建一个新的变量,将实参的值复制给这个变量,并在函数结束后销毁这个变量。因此,在函数中对形参的修改不会影响到外部的变量。
例如:
public static void main(String[] args) {
int a = 10;
changeValue(a);
System.out.println(a); // 输出10
}
public static void changeValue(int b) {
b = 20;
}
在这个例子中,尽管在函数changeValue中修改了形参b的值为20,但是在main函数中输出的变量a仍然是10,说明对形参b的修改不会影响外部的变量a。
而对于引用数据类型(如数组、对象等),函数的形参传递方式是引用传递。这是因为引用数据类型的变量存储的是内存地址,当我们将一个引用数据类型的变量作为实参传递给函数时,函数会创建一个新的指针,指向实参所指向的内存地址。因此,在函数中对形参的修改会影响到外部的变量。
例如:
public static void main(String[] args) {
int[] arr = {1, 2, 3};
changeArray(arr);
System.out.println(Arrays.toString(arr)); // 输出[4, 5, 6]
}
public static void changeArray(int[] array) {
for (int i = 0; i < array.length; i++) {
array[i] += 3;
}
}
在这个例子中,函数changeArray中通过遍历数组,将每个元素加3,此时修改了形参array的值,使得外部的变量arr也发生了变化。
需要注意的是,在Java中,虽然对象属于引用数据类型,但是当我们将一个对象作为实参传递给函数时,实际上是将对象的地址值(即引用)复制给了形参。因此,在函数中修改对象属性的值会对外部的对象产生影响,但是我们无法通过修改形参来改变实参的引用。
最后,需要强调的是在Java中的形参传递中不存在传地址这种说法,因为Java中的形参和实参是完全独立的两个变量,通过值传递或引用传递来进行参数的传递。
