您的位置:首页 > 编程语言 > C语言/C++

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

2016-09-13 16:05 435 查看
为什么说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。原来引用变量里的的对象你不能改,但是他指向的堆对象你可以改啊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: