Java函数参数传递:引用传递、值传递的区别
在Java中,函数参数传递有两种方式:值传递和引用传递。两种方式在操作上的差异十分明显。本文将详细介绍Java中的参数传递方式,并说明它们之间的区别。
一、值传递
在Java中,值传递是一种函数参数传递的方式。值传递将参数的值复制一份,传递给函数。在函数内部对参数值的修改不会影响到函数外部对参数值的使用。例如下面的代码:
public class Test {
public static void main(String[] args) {
int x = 10;
System.out.println("before function call, x = " + x);
Test.inner(x);
System.out.println("after function call, x = " + x);
}
public static void inner(int y){
System.out.println("inside function, y = " + y);
y = y + 1;
System.out.println("after add 1, y = " + y);
}
}
输出结果为:
before function call, x = 10 inside function, y = 10 after add 1, y = 11 after function call, x = 10
可以看到,内部函数对参数值进行了改变,但是在外部函数中参数值并没有改变。
值传递中的参数只有在传递时被复制一份,函数内部对参数值的任何操作都是在这个复制体上进行,不会影响到函数外部的原参数。
二、引用传递
在Java中,引用传递也是一种函数参数传递的方式。引用传递是将参数的地址传递给函数。在函数内部对参数值的修改会影响到函数外部对参数值的使用。例如下面的代码:
public class Test {
private static class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public static void main(String[] args) {
Student student = new Student();
student.setName("Tom");
student.setAge(20);
System.out.println("before function call, student = " + student.getName() + " " + student.getAge());
Test.inner(student);
System.out.println("after function call, student = " + student.getName() + " " + student.getAge());
}
public static void inner(Student std) {
System.out.println("inside function, student = " + std.getName() + " " + std.getAge());
std.setAge(21);
System.out.println("after set age to 21, student = " + std.getName() + " " + std.getAge());
}
}
输出结果为:
before function call, student = Tom 20 inside function, student = Tom 20 after set age to 21, student = Tom 21 after function call, student = Tom 21
可以看到,内部函数对参数值进行了改变,而外部函数调用时,参数值也跟着改变了。
引用传递中的参数在传递时只是传递了它的地址,而函数内部对参数值的任何操作都是在这个地址上进行,会直接影响到函数外部的原参数。
三、值传递与引用传递的区别
值传递和引用传递在Java中操作上的差异十分明显,主要表现在以下几个方面:
1. 对于值传递,函数参数的修改不会影响函数外部对参数值的使用;而对于引用传递,函数参数的修改会影响函数外部对参数值的使用。
2. 对于值传递,在函数参数被传递时,只传递了参数的值的一个副本;而对于引用传递,在函数参数被传递时,传递的是参数的地址。
3. 对于值传递,函数内部任何对参数值的修改都是在副本上进行,不会影响到函数外部的原参数值;而对于引用传递,函数内部任何对参数值的修改都是在原地址上进行,会直接影响到函数外部的原参数值。
需要注意的是,Java中的所有类型都是通过引用进行操作的,包括原始类型。这意味着,当在函数内部修改原始类型参数时,虽然是值传递,但实际上它是通过该类型的引用进行操作的。当在函数内部修改对象类型参数时,则是对该对象在堆中的地址进行操作,因此是通过引用传递。
