首先,咱们得首先知道什么是“值传递”和“引用传递”。java
值传递(pass by value):是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中若是对参数进行修改,将不会影响到实际参数。
引用传递(pass by reference):是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
复制代码
那么,知道这些概念以后,咱们就能够来经过代码来理解这些问题了。函数
代码以下:spa
代码以下code
但是,真的是这样吗?cdn
这个时候,咱们须要回过头来看看引用传递的定义了!对象
引用传递(pass by reference):是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
复制代码
咱们须要仔细理解一下这句话,它的意思是将实际参数的地址(这个地址,也就是咱们说的引用,hash值)传递到函数中,那么在函数中对实际参数所进行的修改,将影响到实际参数。blog
因此,在本次的这个例子中,你既然修改的不是你传递进去的参数(也就是咱们说的引用),你修改的是传递进去的引用所指向的对象自己,那么确定就会出现对象的变化。字符串
从一开始,你就没有对你传递进去的参数进行修改!因此,这个例子自己就举错了。hash
那么,怎么才是对传递进去的参数进行修改呢?请看第三步!it
代码以下:
user=new User();
复制代码
而从代码运行的结果能够看出,实际参数并无变化。
也就是说,咱们在函数中对参数进行的修改,并无影响到实际参数。
那么,从这里开始,咱们能够说是值传递了。这个时候咱们能够再看一个例子。
代码以下:
这里,咱们必需要了解到一件事情,String类型的对象的修改,是和其余基础类型是不一致的。String类型永不可变。也就是说,在代码
a="你";
复制代码
中,实际的状况是这样的,由于java中存在字符串常量池,当咱们发现常量池中发现没有“你”这个字符串的时候,那么咱们将会生成一个新的对象返回。
也就是说,实际上也是对传递进去的引用进行了修改,可是,也没有影响到实际参数。因此,并非引用传递。
java中只有值传递,没有引用传递。