Java函数参数传递的详解:值传递和引用传递
发布时间:2023-07-03 16:32:40
在Java中,函数参数传递可以分为值传递和引用传递两种方式。
值传递是指在函数调用时,将实际参数的值复制一份给形式参数,这样函数内部对形式参数的操作不会影响到实际参数。简单来说,就是通过值传递方式传递的参数,在函数内部对该参数的任何修改都不会影响到调用方。
例如:
public class ValueTransferDemo{
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
swap(num1, num2);
System.out.println("num1=" + num1); // 输出为10,未受到swap方法的影响
System.out.println("num2=" + num2); // 输出为20,未受到swap方法的影响
}
}
在上述代码中,调用swap方法时,传递的是num1和num2的值,所以在swap方法内部对a和b进行交换并不会影响到num1和num2的值。
引用传递是指在函数调用时,将实际参数的地址传递给形式参数,形式参数在函数内部直接操作的是实际参数的内存空间。简单来说,就是通过引用传递方式传递的参数,在函数内部对该参数的修改会影响到调用方。
例如:
public class ReferenceTransferDemo{
public static void changeName(Student student) {
student.setName("Tom");
}
public static void main(String[] args) {
Student stu = new Student("Jerry");
changeName(stu);
System.out.println(stu.getName()); // 输出为Tom,受到changeName方法的影响
}
}
class Student {
private String name;
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
在上述代码中,调用changeName方法时,传递的是stu对象的引用,所以在changeName方法内部对student对象的操作会改变stu对象的属性。
需要注意的是,Java中所有的基本类型(如int、float等)都是值传递,而对象类型(如String、自定义类等)则是引用传递。但是,对于对象类型,如果在函数内部对参数进行重新赋值,那么该参数将指向一个新的对象,这样会改变指向该对象的引用,但外部实际参数的引用不会受到影响。
总结起来,虽然Java中的参数传递可以通过值传递和引用传递两种方式进行,但在实际开发中我们常用的是引用传递,因为通过引用传递方式可以实现更加灵活且高效的操作。对于基本类型的参数,我们可以通过将其包装成对象来实现引用传递的效果。
