Java中的函数参数传递(传值与传引用)
发布时间:2023-06-16 23:55:18
在Java中,函数参数传递是通过值传递方法来实现的。这意味着当我们调用一个函数时,我们传递给函数的是该对象的一个副本而不是对象本身。这个副本称为函数参数。
传值:
在Java中,当我们传递一个基本类型的数据(如int,double等)时,我们实际上是传递该变量的副本。这意味着在函数中对该参数的任何修改都不会影响原始变量的值。
例如:
public static void main(String[] args) {
int a = 10;
add(a);
System.out.println("a: " + a);
}
public static void add(int b) {
b = b + 5;
}
上述代码中,我们定义了一个变量a,并在函数add中将其增加了5。然而,当我们在main函数中打印a时,我们会发现其值仍为10而不是15。这是因为在函数中修改b对a没有任何影响。
传引用:
当我们传递一个对象作为参数时,我们实际上传递的是该对象的引用。这意味着我们实际上传递的是该对象在内存中的地址,而不是对象本身。因此,当我们在函数中修改该对象的属性时,原始对象的属性也会发生改变。
例如:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
addOne(list);
System.out.println("List: " + list);
}
public static void addOne(List<Integer> myList) {
for (int i = 0; i < myList.size(); i++) {
myList.set(i, myList.get(i) + 1);
}
}
上述代码中,我们在main函数中定义了一个List对象,并通过函数addOne将其中的所有元素都加1。当我们打印list时,我们会发现其所有元素都增加了1。这是因为我们传递了一个指向list的引用,而不是传递了list的副本。
需要注意的是,虽然我们传递了对象的引用,但是我们不能在函数中更改该对象的引用。例如,我们不能在函数中将参数对象指向另一个对象。
例如:
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
swapList(list, new ArrayList<>());
System.out.println("List: " + list);
}
public static void swapList(List<Integer> list1, List<Integer> list2) {
List<Integer> temp = list1;
list1 = list2;
list2 = temp;
}
在上述代码中,我们定义了一个交换函数swapList,它接受两个List对象作为参数,并将它们的引用交换。然而,当我们在main函数中打印list时,我们会发现其值并没有改变。这是因为在函数中我们只是交换了指向对象的引用,而并没有交换对象本身。因此,我们不能在函数中更改传递的引用。
