Java函数传递参数:值传递和引用传递的区别?
Java函数传递参数:值传递和引用传递的区别?
Java语言是一种强类型语言,其函数参数传递方式主要有值传递和引用传递两种。在Java中,所有的函数参数传递都是值传递。然而,不同的是,Java中的对象引用也是一个值,当我们传递一个对象的引用时,也称之为引用传递。下面将详细讨论Java函数参数传递中的值传递和引用传递。
1. 值传递
值传递就是将参数的值复制一份,然后把复制后的值传递给函数,函数内部操作的是复制后的值。这样,函数内部对参数的任何修改不会影响到原来的变量。
比如:
public class Test{
public static void main(String[] args) {
int a = 1;
int b = 2;
swap(a, b);
System.out.println("a=" + a + " b=" + b);
}
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
}
这个程序会输出 "a=1 b=2"。原因是在 swap 函数内部交换的是 a 和 b 的副本。因此,实参 a 和实参 b 并没有改变。
参数的值传递方式比较简单,适用于基本数据类型的传递,但是如果要传递一个对象,则需要注意。当我们传递一个对象的引用时,虽然引用是一个值,但是实际上引用指向的还是同一个对象。这时,函数内部对该对象的修改会影响到该对象在函数外的使用。
2. 引用传递
引用传递就是将参数的地址复制一份,然后把复制后的地址传递给函数。这样,在函数内部对参数的任何修改会影响到原来的变量,因为它们指向同一个对象。
比如:
public class Test{
public static void main(String[] args) {
Person p = new Person("Tom", 18);
change(p);
System.out.println(p.getName() + " " + p.getAge());
}
public static void change(Person p) {
p.set("Jerry", 20);
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void set(String name, int age) {
this.name = name;
this.age = age;
}
}
这个程序会输出 "Jerry 20",因为 change 函数中的参数 p 就是 main 函数中的 p 引用,它指向的是同一个对象。所以在 change 函数中对 p 的修改会影响到 main 函数中的 p。
需要注意的是,虽然针对同一个对象,引用传递会在函数内部影响到函数外部,但是如果在函数内部把传入的引用指向了另外一个对象,则无法影响到函数外部。
比如:
public class Test{
public static void main(String[] args) {
Person p1 = new Person("Tom", 18);
Person p2 = new Person("Jerry", 20);
change(p1, p2);
System.out.println(p1.getName() + " " + p1.getAge());
System.out.println(p2.getName() + " " + p2.getAge());
}
public static void change(Person p1, Person p2) {
Person temp = p1;
p1 = p2;
p2 = temp;
}
}
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void set(String name, int age) {
this.name = name;
this.age = age;
}
}
这个程序会输出 "Tom 18" 和 "Jerry 20",因为在 change 函数中交换的是 p1 和 p2 的副本,不会影响到原有的引用。
