正文
这里要注意的是:
- 准确的来说只有值传递,调用子函数的所有操作都是值传递
- 引用传递,最终还是值传递,传递的是对象的地址
值传递
比如我们打开我们的相关java调试类:
![26d4f1f2e036ce5921e2fc914227c0dd.png](https://i-blog.csdnimg.cn/blog_migrate/9fc89fa49cebb68fd103244e6b60a791.jpeg)
![9a02d95adde5d8404811d9ec7b9e89d0.png](https://i-blog.csdnimg.cn/blog_migrate/dffea81bb3ef129de0c8b7aec52abfea.jpeg)
![6d46ed61197acaf431fce0e4e239ee89.png](https://i-blog.csdnimg.cn/blog_migrate/bef1e06170e31ba2b584c35d72893d8c.jpeg)
我们都知道,声明一个变量后,计算机就会申明出来一个内存地址,值传递的时候为什么最后的值没有发生变化呢?
下面我们来用图进行解释一下:
第一步,声明 i,j 的变量,申请内存显示为
![7573a71f3861e77df6dbfe7cdcf91b11.png](https://i-blog.csdnimg.cn/blog_migrate/cf460aac3528cb3409ff47060c973340.jpeg)
第二步,执行交换时,申请内存显示为
![a5df6f35d3a084c76cae2be6fa3ac04b.png](https://i-blog.csdnimg.cn/blog_migrate/51b0da82bb1246068f10884bd13b4d94.jpeg)
第三步,执行交换后,方法体的子涵数就会执行一个出栈的操作,即被系统销毁回收掉。
![ea22c1dfcc84ee5a3a6a45917e363eb8.png](https://i-blog.csdnimg.cn/blog_migrate/9e0f0384ceceb2bf3efa829b452c0171.jpeg)
第四步,子函数被销毁完后,其内存为:
![7573a71f3861e77df6dbfe7cdcf91b11.png](https://i-blog.csdnimg.cn/blog_migrate/cf460aac3528cb3409ff47060c973340.jpeg)
注意 只要你把一块内存空间申明出来,无论里面的值怎么变化,都不会改变其内存地址。
引用传递
引用传递代码如下:
![17383adc46d9bf5f0138e55980ea2aa5.png](https://i-blog.csdnimg.cn/blog_migrate/dc8d98bdd0625e670d53ab285c237e9b.jpeg)
![7261270d02884da14b04aa44b60a423a.png](https://i-blog.csdnimg.cn/blog_migrate/2d2bcdf07a2016248d4ee7dfaf4fa54e.jpeg)
![b6d40596a345283087f911b765626ab9.png](https://i-blog.csdnimg.cn/blog_migrate/9ae765cda66a1ab982ad32af76cd0d99.jpeg)
接下来我们对于引用传递也进一步用图文解释:
第一步:声明对象后的内存
![c2e85778aedff52dc445552fd64337a5.png](https://i-blog.csdnimg.cn/blog_migrate/3450113671f5dd15b5f485fdb06f717f.jpeg)
第二步: 对象的值进行互换
![f556f471bfb5860e27aa2270cba53deb.png](https://i-blog.csdnimg.cn/blog_migrate/0baac4ca71c294f1284057327311573c.jpeg)
第三回: 被系统回收
![05539b5a629a1686d9aa191eccecc6d4.png](https://i-blog.csdnimg.cn/blog_migrate/9aa829a38c98a6f951ae9a74e62deb97.jpeg)
第四步:最终内存的值为
![433e91d30dfe07d97d6de6c86aa52ed4.png](https://i-blog.csdnimg.cn/blog_migrate/dc9c8e2b8d70f661978527a1886516c8.jpeg)
注意引用传递传递的是内存地址,对内存地址里面的值进行改变因而会改变,值传递传递的是值而非内存地址。
这就解释了传递和引用传递传递值时为什么会有不同的结果。
关注小编,小编会每天为你分享有趣的技术文章~