值传递(有拷贝)
值传递是指将实际参数的拷贝传递给函数中。
引用传递(无拷贝)
引用传递是指将实际参数的地址传递到函数中。
这里我们可以看到区别值传递和引用传递根本的方法是判断有没有拷贝。
在java中,只存在值传递,不存在引用传递。我们可能会碰到fun(s),s为一个对象的引用,这样的参数传递我们可能会误认为是引用传递,但其实这中间发生了拷贝,拷贝的是对象的地址,并不是直接传递的对象的地址。
可以这样理解,传递对象的引用是值传递,发生了所引用对象地址的拷贝,只是拷贝的地址恰好和原对象的地址一样,看起来就像是没有发生拷贝,传递的是原对象的地址一样。
通过这张图片我们可以看到,a1就是复制的地址,这里只不过a1所代表的地址刚好是原对象地址。其实已经发生拷贝(对象地址的拷贝),所以java中只存在值传递,不存在引用传递。
public class Test { static Student a = new Student(15); static Student b = new Student(20); public static void main(String[] args) { System.out.println(a.age);//15 swap(a,b); System.out.println(a.age);//15 } public static void swap(Student a1, Student b1){ Student t = a1; a1 = b1; b1 = t; } }
通过这个例子也可以看出是值传递,如果是引用传递的话,最后输出a.age应该输出20。