为什么说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。原来引用变量里的的对象你不能改,但是他指向的堆对象你可以改啊。