什么是值传递?
值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
什么是参数传递?
引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
为什么Java只有值传递
记住,基本数据类型值传递中的值就是实际参数的实际值,比如int a=10,此时的值就是10;
复杂数据类型值传递中的值指的是实际参数的地址值,例如 User user作为参数调用的时候 ,传递的是它的地址值。
首先来看基本数据类型的值传递例子:
public class Test {
public static void main(String[] args) {
int b=10;
change(b);
System.out.println(b);//输出b=10;
}
public static void change(int a ){
a=20;
}
}
通过上面例子可以看出,在我们调用change()方法之后,b的值依然是10,这就是因为当我们在调用change方法的时候,只是将b的值拷贝了一份,然后将这个值赋值给了形参a,这样即使我们改变了a的值,主方法中的b依然也不会改变,这就是值传递。
下面是复杂数据类型的值传递
public class Test {
public static void main(String[] args) {
Student student=new Student();
student.setAge(10);
student.setName("sun");
change(student);
System.out.println(student.getName());
}
public static void change(Student student ){
student.setName("zhangsan");
}
}
上面这一段代码输出的结果是zhangsan,这时候很多小伙伴就困惑了,不是说Java只有值传递吗?为什么student的名字变成了zhangsan?还请往下看。
复杂数据类型值传递中的值指的是实际参数的地址值,例如 User user作为参数调用的时候 ,传递的是它的地址值。
也就是在传递的时候我们传递的值是地址值,并不是传递student这个对象的内容属性,所以在change方法里面修改了student的name属性,主方法student的name会改变的原因就是这样。
下面我们可以输出main方法中student的地址值来看看在调用change前后main方法的student的地址值是否有改变。
public class Test {
public static void main(String[] args) {
Student student=new Student();
student.setAge(10);
student.setName("sun");
change(student);
System.out.println(student.getName());
System.out.println("主方法里面的student:"+student);
}
public static void change(Student student ){
System.out.println("change里面的student:"+student);
student.setName("zhangsan");
}
}
输出结果:
可以看到student的地址值并没有改变,所以这就依然诠释了在Java的世界里,只有值传递,没有引用传递。我们可以改一下change方法里面student的地址值,看看main方法中的地址值是否有改变。
public class Test {
public static void main(String[] args) {
Student student=new Student();
student.setAge(10);
student.setName("sun");
System.out.println("change方法调用前:"+student);
change(student);
System.out.println("change方法调用后:"+student);
}
public static void change(Student student ){
student=new Student();
System.out.println("change里面的student:"+student);
}
}
输出结果:
以上是打算参加秋招的我复习Java基础时候做的笔记。