Java里面本质都是值传递——别人写的表达不清楚,所以我写了下,方便初学者福利 也方便C语言思维的人理解。

为什么说Java里面都是值传递。


一:首先什么是值传递?

值传递就是不影响原来的值,临时copy一份拿来用。   在方法里也就是栈内存里。


二:不是说Java还有引用传递嘛?

且听我慢慢道来。

都是值传递这个说法确实是都是如此啊,

首先:

普通类型:copy一份内存里的数值,然后拿copy的去用。大家互不影响

引用类型变量:copy一份内存里的数值,然后拿copy的去用。大家互不影响

但是!!!!

引用类型copy的是什么?

copy的是引用信息,也就是它指向的那个堆得内存首地址。别人拿到了这个首地址。但是这个首地址可不简单呢,隐藏了一个福利啊。


举个例子:

就是引用传递,传递的其实也是copy一份值, 但是特殊在这个值很特殊的东西,这是一个指向堆内存的地址值,好比也就是你把你家保险箱密码copy一份给人家,那么人家有了密码, 人家得到的可是你的密码唉,这个密码拿去就能操作堆内存了,虽然你改变不了他手里的密码,但是你可以改变密码对应的保险箱的东西啊。

所以引用类型特殊:就是得到这个值之后还得到了这个值后面的隐藏的福利,隐藏了一个控制权的福利。也就是copy得到了那个指向的堆的控制权。

而普通变量传递的是值本身的内容。好比作业,那么copy一份就是一份。虽然都是操作,但是各自互不影响。但是作业后面没隐藏福利啊,就是一堆作业内容。


——————————————————————————————————————————
C语言习惯是值传递和地址传递。是很清楚的。但是Java是引用,稍稍有点啰嗦。




【补充】
Java里string是值传递,是内容copy一份临时的值。原来的不便变。两个仓库而已。
数组是地址传递,是copy了一份堆的首地址,也就是别人也得到了对象的管理权,有了两个遥控器。都指向堆。

new 出的String 是对象,本应是传递引用, 但String 是不可变对象,所以在其值创建后,无法对其值做修改,所以跟值传递一个效果。传递的就是堆里的内容,
顺便说一下, 8个基础类型对应的包装类型全部都是不可变对象,都是值传递。



值传递那么就是来一次内容的copy。原来值得内容你不能改,没控制权。
引用传递是里面存的首地址的copy。原来引用变量里的的对象你不能改,但是他指向的堆对象你可以改啊。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值