为何说 Java 中只有值传递

首先,咱们得首先知道什么是“值传递”和“引用传递”。java

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

 引用传递(pass by reference):是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
复制代码

那么,知道这些概念以后,咱们就能够来经过代码来理解这些问题了。函数

第一步

代码以下:spa

结果为:

从当前的代码来看,发现实际参数并无发现变化,那么咱们就说是值传递了,可是仅仅是这样简单吗?先不用急着下结论,来看看第二步吧。

第二步:

代码以下code

结果为:

在这里,咱们发现,两次打印出来的对象竟然是同样的!实际参数竟然改变了!因而这个时候,就马上有人来讲了,java中的不是值传递,是引用传递。

但是,真的是这样吗?cdn

这个时候,咱们须要回过头来看看引用传递的定义了!对象

引用传递(pass by reference):是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
复制代码

咱们须要仔细理解一下这句话,它的意思是将实际参数的地址(这个地址,也就是咱们说的引用,hash值)传递到函数中,那么在函数中对实际参数所进行的修改,将影响到实际参数。blog

因此,在本次的这个例子中,你既然修改的不是你传递进去的参数(也就是咱们说的引用),你修改的是传递进去的引用所指向的对象自己,那么确定就会出现对象的变化。字符串

从一开始,你就没有对你传递进去的参数进行修改!因此,这个例子自己就举错了。hash

那么,怎么才是对传递进去的参数进行修改呢?请看第三步!it

第三步:

代码以下:

结果以下:

真正修改了传递进去的参数(也就是引用的),是下面这段代码。

user=new User();
复制代码

而从代码运行的结果能够看出,实际参数并无变化。

也就是说,咱们在函数中对参数进行的修改,并无影响到实际参数。

那么,从这里开始,咱们能够说是值传递了。这个时候咱们能够再看一个例子。

第四步:

代码以下:

答案以下:

咱们发现,这里咱们一样传递的是对象,可是并且也是对参数所指向的对象进行修改,可是竟然没有影响到实际参数。这和咱们的 第二步竟然不同。

这里,咱们必需要了解到一件事情,String类型的对象的修改,是和其余基础类型是不一致的。String类型永不可变。也就是说,在代码

a="你";
复制代码

中,实际的状况是这样的,由于java中存在字符串常量池,当咱们发现常量池中发现没有“你”这个字符串的时候,那么咱们将会生成一个新的对象返回。

也就是说,实际上也是对传递进去的引用进行了修改,可是,也没有影响到实际参数。因此,并非引用传递。

结论:

java中只有值传递,没有引用传递。

相关文章
相关标签/搜索