📅  最后修改于: 2023-12-03 15:31:49.315000             🧑  作者: Mango
在Java中,参数传递有两种方式:值传递和引用传递。值传递是指将一个变量的值复制给另一个变量,两者之间互不影响。引用传递是指将一个对象的引用(地址值)传递给另一个变量,在传递过程中,两个变量指向同一个对象,因此对其中一个变量的修改会影响另一个变量。
在Java中,基本数据类型(byte、short、int、long、float、double、char、boolean)都采用值传递的方式传递参数。在值传递中,形式参数(函数定义的参数)和实际参数(调用函数时传递的参数)都是一份独立的数据,它们之间互不影响。
下面是一个例子:
public class Test {
public static void main(String[] args) {
int a = 10;
change(a);
System.out.println(a);
}
public static void change(int x) {
x = 20;
}
}
输出结果为10。在change方法中,x是形式参数,它的初始值为10,然后将它的值修改为20。但是,在main方法中,变量a的值并没有改变,因为change方法中的修改只是修改了形式参数x的值,不会影响实际参数a的值。
在Java中,除了基本数据类型之外,其他所有的数据类型(数组、对象等)都采用引用传递的方式传递参数。在引用传递中,形式参数和实际参数都指向同一个对象,在函数内部对形式参数的修改会影响到实际参数的值。
下面是一个例子:
public class Test {
public static void main(String[] args) {
int[] array = {1, 2, 3};
change(array);
System.out.println(array[0]);
}
public static void change(int[] x) {
x[0] = 10;
}
}
输出结果为10。在change方法中,x是形式参数,它的初始值为实际参数array所指向的数组{1, 2, 3}的地址值。然后将数组的第一个元素修改为10。由于形式参数和实际参数都指向同一个数组,因此在main方法中,输出array[0]的值为10。
需要注意的是,在引用传递中,如果在函数内部将形式参数重新赋值为新的对象,那么这个新的对象只会在函数内部生效,对实际参数没有影响。
下面是一个例子:
public class Test {
public static void main(String[] args) {
int[] array1 = {1, 2, 3};
int[] array2 = {4, 5, 6};
change(array1, array2);
System.out.println(array1[0] + " " + array2[0]);
}
public static void change(int[] x, int[] y) {
x = y;
y[0] = 10;
}
}
输出结果为1 10。在change方法中,将形式参数x重新赋值为y,即将x指向的数组改为y指向的数组。然后将y的第一个元素修改为10。但是,由于重新赋值只是让x指向了一个新的数组,因此对实际参数array1没有影响,仍然指向原来的数组{1, 2, 3}。因此输出array1[0]的值为1,而输出array2[0]的值为10。