最近一直在纠结java 中的 值传递和引用传递 经过各种百度了解 触摸到了一点点 希望求证 请大家指正(jdk 1.8下);
在百度上随处可见对于值传递和引用传递 大家一致理解是基础类型和对象的区别:在传递一个基础类型 的时候 会创建一个空间去保存值(生成值副本)但是引用传递保存的却是一个指向堆内存的地址 所以就产生了值传递和引用传递;
但是,在百度中我也发现 其实在创建一个基础类型变量的时候,栈内存中其实保存的也是地址 并没有直接保存值;那内存又是怎么去保存这个值呢?
先了解一下基础类型申请时 内存做了哪些工作:
当在 内存中申请了一个基础变量,栈内存中会保存一个指向;然后去查看 栈中有没有这个值如果有这个值,变量内的指向便会指向这个值。没有这个值的话,就会把这个值放到栈内存当中。当给i2 赋其他值时,i2内保存的指向便会改变,
在来看看传递的时候内存其实都做了什么:
值传递:
开启一个方法栈 管理这个方法。方法栈中 开启一个新的空间 去保存传递进来的一个指向栈空间的指向, 然后在方法中去改变这个变量的值,这个变量保存的指向改变了 并且指向了栈中其他值;所以这里变量的值改变了(保存在常量池中的类型和这经历一致)
引用传递:
开启一个方法栈 管理这个方法。方法栈中 开启一个新的空间 去保存传递进来的一个指向堆空间的指向, 然后在方法中
去改变堆空间中的值,注意改变的是堆空间中的值。 并没有改变栈中保存指向堆空间的指向,所以 以致在方法外面发现对象的值改变了;
其实在传递中,两个原始指向都没有改变。只是在方法中 两种类型 操作的对象(把一个快空间当成一个对象)不同 ,值传递 是直接去改变了原始传递进来的对象,而引用传递是去修改了原始传递进来的对象里面的一个值
所以其实java中只存在值传递或者只存在引用传递 并没有“值传递”和引用传递共存;
ps:第一次写。有点方。貌似讲的有点云里雾里,希望看客不要喷,毕竟也是花了时间的。不过有建议,指点的希望大家也不要吝啬