Java中函数参数的传递方式及其区别(值传递和引用传递)?
发布时间:2023-07-04 19:26:47
在Java中,函数参数的传递方式有值传递和引用传递。值传递是指将实参的值复制一份给形参,而引用传递是指将实参的引用地址传递给形参。两种传递方式在实际应用中有着明显的区别,下面将详细介绍这两种传递方式及其区别。
1. 值传递
值传递是指在函数调用时,将实际参数的值复制一份给形式参数,在函数内部对形式参数的任何改动都不会改变实际参数的值。在Java中,基本数据类型的传递就是采用值传递的方式。
示例:
public class ValuePassingExample {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
System.out.println("交换前:num1 = " + num1 + ", num2 = " + num2);
swap(num1, num2);
System.out.println("交换后:num1 = " + num1 + ", num2 = " + num2);
}
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
}
输出结果:
交换前:num1 = 10, num2 = 20 交换后:num1 = 10, num2 = 20
可以看到,虽然在swap函数中对a和b进行了交换,但是不会影响到main函数中的实参num1和num2的值。这是因为在值传递中,函数对形参的修改只是修改了形参的副本,不会改变实参的值。
2. 引用传递
引用传递是指在函数调用时,将实际参数的引用地址传递给形式参数,实际参数和形式参数指向同一个对象,在函数内部对形式参数的任何改动都会改变实际参数的值。在Java中,对象类型的传递就是采用引用传递的方式。
示例:
public class ReferencePassingExample {
public static void main(String[] args) {
Person person = new Person("Tom");
System.out.println("修改前:person = " + person.getName());
changeName(person);
System.out.println("修改后:person = " + person.getName());
}
public static void changeName(Person p) {
p.setName("Jerry");
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
输出结果:
修改前:person = Tom 修改后:person = Jerry
可以看到,虽然在changeName函数中修改了形参p的名字,但是同时也改变了main函数中的实参person的名字。这是因为在引用传递中,实参和形参指向同一个对象,因此对形参的任何改动都会影响到实参。
总结:
- 值传递是将实参的值复制一份给形参,修改形参不会改变实参的值。适用于基本数据类型。
- 引用传递是将实参的引用地址传递给形参,实参和形参指向同一个对象,修改形参会改变实参的值。适用于对象类型。
在使用函数参数时,需要根据需要选择适合的传递方式,理解这两种传递方式的区别对于编写正确的程序非常重要。
