前言
首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中。
更何况,要想知道Java到底是传值还是传引用,起码你要先知道传值和传引用的准确含义吧?可是如果你已经知道了这两个名字的准确含义,那么你自己就能判断Java到底是传值还是传引用。
这就好像用大学的名词来解释高中的题目,对于初学者根本没有任何意义。
一、值传递和引用传递是什么?
值传递:在调用方法时将实际参数复制一份到方法中,在方法中对参数进行修改并不会影响到实际参数。
引用传递:在调用方法时将实际参数的地址直接传递到方法中,在方法中对参数进行修改会影响到实际参数。
二、如何理解Java中只有值传递没有引用传递
public static void main(String[] args) {
ParamTest pt = new ParamTest();
User hollis = new User();
hollis.setName("Hollis");
hollis.setGender("Male");
pt.pass(hollis);
System.out.println("print in main , user is " + hollis);
} public void pass(User user) {
user = new User();
user.setName("hollischuang");
user.setGender("Male");
System.out.println("print in pass , user is " + user);
}
输出结果:
print in pass , user is User{name=‘hollischuang’, gender=‘Male’} print in main , user is User{name=‘Hollis’, gender=‘Male’}
解析:
如果是引用传递,在pass()函数中的 user = new User()这段代码中,user的地址改变了,那么应该main函数中holis对象的地址也会变,在pass中改变了user对象中name成员的值,holis对象的应该也改变了,但是并没有。
这里就证明了pt.pass(holis)调用pass()函数是把holis的地址复制了一份,在传给形参的。
总结
地址值也是值,传递地址值不一定就是引用传递。
值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参