什么是值传递,什么是引用传递

285 阅读2分钟
  • 值传递(
    pass by value)

是指在调用函数时将实际参数复制一份传递到函数中,
这样在函数中如果对参数进行修改,将不会影响到实际参数。
  • 引用传递(
    pass by reference)

是指在调用函数时将实际参数的地址直接传递到函数中,
那么在函数中对参数所进行的修改,将影响到实际参数。
public static void main(String[] args) {
int i = 10;
pass(i );
System.out.println("i =" + i);
}
public static void pass(int j) {
j = 20;
System.out.println("j = " + j);
}
上面的代码中,我们在
pass方法中修改了参数j的值,
然后分别在pass方法和main方法中打印参数的值。
pass方法内部对name的值的修改并没有改变实际参数i的值。
那么,按照上面的定义,有人得到结论:Java的方法传递是值传递。
public static void main(String[] args) {
User user = new User();
user.setName("facker");
user.setGender("Male");
pass(user);
System.out.println("user =" + user);
}
public static void pass(User user) {
user.setName("uzi");
System.out.println("user =" + user);
}
经过
pass方法执行后,实参的值竟然被改变了,
那按照上面的引用传递的定义,实际参数的值被改变了,这不就是引用传递了么。
于是,根据上面的两段代码,
有人得出一个新的结论:Java的方法中,在传递普通类型的时候是值传递,在传递对象类型的时候是引用传递。
public static void main(String[] args) {
String name = "facker";
pass(name);
System.out.println("name = " + name); //facker
}
public void pass(String name) {
name = "uzi";
System.out.println("name =" + name); //uzi
}
同样传递了一个对象,但是原始参数的值并没有被修改,难道传递对象又变成值传递了?
上面的参数其实是值传递,把实参对象引用的地址当做值传递给了形式参数。
所以说,
Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。