一、概念
在区别其二者之前,要先了解一下二者的概念是如何。
(1) 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
(2) 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
二、区别
值传递 | 引用传递 | |
传递区别 | 传递一个副本 | 传递引用地址 |
结果区别 | 修改副本不会影响本体 | 直接修改本体 |
可将二者的区别粗略理解成如图:
三、代码演示
示例一:值传递演示(基本数据类型的传递)
public class S110 {
public static void main(String[] args) {
S110 s110 = new S110();
int i = 10;
System.out.println(i);
s110.change(i);
System.out.println(i);
}
public void change (int i){
i = 20;
System.out.println(i);
}
}
运行结果:
10
20
10
由结果可见,我们的在change方法中对于i 的重新赋值,并没有改变main中i的值。
示例二:引用传递的演示(String)
public class S110 {
public static void main(String[] args) {
S110 s110 = new S110();
String i = "我要打十个";
System.out.println(i);
s110.change(i);
System.out.println(i);
}
public void change (String i){
i = "打不了十个";
System.out.println(i);
}
}
运行结果:
我要打十个
打不了十个
我要打十个
由结果来看,我们也并没有改变i的值,这是因为String作为特殊引用数据类型,java给了它很多其他引用数据类型没有的特权,让我们来写一个完整版的传递。
public class S110 {
public static void main(String[] args) {
S110 s110 = new S110();
String i = "我要打十个";
System.out.println(i);
s110.change(i);
System.out.println(i);
}
public void change (String i){
i = new String("打不了十个");//相当于创建了一个新的空间去储存i的值。
System.out.println(i);
}
}
示例三:真正的引用传递的演示(引用数据类型)
public class S110 {
public int i = 10;
public void setI(int i){
this.i = i;
}
public static void main(String[] args) {
S110 s110 = new S110();
s110.setI(10);
System.out.println(s110.i);
s110.change(s110.i);
System.out.println(s110.i);
}
public void change (int i){
setI(20);
}
}
输出结果为:
10
20
这次真正的改变了i 的值。
四、总结
从结果角度看:
值传递:不能在方法中改变原本数据值的传递
引用传递:能在方法中改变原本数据值的传递
从代码角度看:
值传递:不需要在方法中new新对象(开辟新空间)
引用传递:需要在方法中new新对象(开辟新空间)
String:String也是包含new的,完整写出来应该是:i = new String(" "); 的格式,只是java中可以简写为:i = “ ” ;