博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么说 Java 中只有值传递
阅读量:6074 次
发布时间:2019-06-20

本文共 1182 字,大约阅读时间需要 3 分钟。

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

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

那么,知道这些概念之后,我们就可以来通过代码来理解这些问题了。

第一步

代码如下:

结果为:

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

第二步:

代码如下

结果为:

在这里,我们发现,两次打印出来的对象居然是一样的!实际参数居然改变了!于是这个时候,就立刻有人来说了,java中的不是值传递,是引用传递。

可是,真的是这样吗?

这个时候,我们需要回过头来看看引用传递的定义了!

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

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

所以,在本次的这个例子中,你既然修改的不是你传递进去的参数(也就是我们说的引用),你修改的是传递进去的引用所指向的对象本身,那么肯定就会出现对象的变化。

从一开始,你就没有对你传递进去的参数进行修改!所以,这个例子本身就举错了。

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

第三步:

代码如下:

结果如下:

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

user=new User();复制代码

而从代码运行的结果可以看出,实际参数并没有变化。

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

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

第四步:

代码如下:

答案如下:

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

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

a="你";复制代码

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

也就是说,实际上也是对传递进去的引用进行了修改,但是,也没有影响到实际参数。所以,并不是引用传递。

结论:

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

转载地址:http://nnsgx.baihongyu.com/

你可能感兴趣的文章
浏览器中关于事件的那点事儿(转)
查看>>
[转]Vim 复制粘贴探秘
查看>>
4.元组
查看>>
为什么Dotnet Core的DI默认是在控制器中注入
查看>>
[Go] golang连接redis测试
查看>>
spring 缓存 @CachePut 和 @Cacheable 区别
查看>>
VS自定义代码段简单使用
查看>>
第12章 posix 线程
查看>>
POJ Oulipo
查看>>
JavaScript常见调试方法
查看>>
httpclient跳过https请求的验证
查看>>
Apache的Mod_rewrite学习 (RewriteCond重写规则的条件) 转
查看>>
Diary
查看>>
友盟消息推送(一)
查看>>
Python3学习笔记(十二):闭包
查看>>
第六周作业
查看>>
JavaScript学习——JavaScript比较和 逻辑运算
查看>>
tableView如何优化、 处理卡顿问题?
查看>>
玩转车联网2--汽车内部通讯和车联网整体架构
查看>>
集合和多态
查看>>