1、定义
值传递:在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数;
引用传递:在调用函数时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数;
2、实例
1)
public class Main {
public static void main(String[] args) {
int num = 10;
new Main().pass(10);
System.out.println(num);
}
private void pass(int num) {
num = 20;
System.out.println(num);
}
}
运行结果:20 10
显然,这是一个典型的值传递的例子。
2)
public class Main {
public static void main(String[] args) {
User user = new User(1, "tom");
new Main().pass(user);
System.out.println(user.getId());
}
private void pass(User user) {
user.setId(2);
System.out.println(user.getId());
}
}
运行结果:2 2
可见值发生了变化,此时传递的是对象的引用的一个拷贝,但是这个例子却表现的不明显,可能会被误认为是引用传递。下面这个例子就很好多阐释了java中只有值传递。
3)
public class Main {
public static void main(String[] args) {
User user1 = new User(1, "tom");
User user2 = new User(2, "shandy");
new Main().swap(user1, user2);
System.out.println(user1.getId());
System.out.println(user2.getId());
}
private void swap(User user1, User user2) {
User t = user1;
user1 = user2;
user2 = t;
System.out.println(user1.getId());
System.out.println(user2.getId());
}
}
运行结果:2 1 :1 2
由此可见原来的对象的值是没有发生变化的,交换的只是传递过来的对象的引用。所以可以得知这并不是引用传递,只是对于对象引用的拷贝的传递,所以还是值传递。
3、总结
- 一个方法不能修改基本数据类型的参数
- 一个方法可以改变对象参数的状态
- 一个方法不能让对象参数去引用一个新的对象