参数传递的不同情形
首先说明的是,Java和C中所有的参数传递都是值传递。
不管是参数类型是原始类型,还是引用类型,其实传过来都是值。只不过原始类型传过来的值正是你所需要的,而引用类型传过来的值是个地址,你通过这个地址来找到你所要用到的值。
参数传递分为两种情况。
一 参数类型是原始类型,形参只是得到实参的值,它和实参是两个不同的对象,不会互相影响。
二 参数类型是引用类型,形参得到的是实参中存的地址,形参和实参可以通过这个地址访问到同一个对象。无论你是你通过实参还是形参来修改对象的属性,它的内容都是改变了。但是,如果你在方法中改变了形参的指向,它本来存的是A的地址,后来改为存入B的地址,它就不会再对A产生什么影响了。
更好理解的比方,类似于,两个盒子。第一种情况是两个盒子中的放的东西是一样的,但是无论其中一个盒子里的东西怎么改变,对另一个盒子里的内容都不会有影响。第二种情况就是两个盒子里放了两把钥匙,利用他们就能够进入同一间屋子。无论屋子里的布局怎么变化,你打开的都是同一间屋子。,如果你在方法中改变了形参的指向,就相当于你把其中一个盒子的钥匙换了,那么两把钥匙开的就是两扇门。
包装类作参数传的是什么?
最开始的时候我简单的以为使用包装类作参数就可以解决通过形参进行两变量交换的问题。结果就是啥也没换。
到这里我就在想为什么会这样呢,网上的说法有那么几种。
第一种是
出处:
https://blog.csdn.net/qq_44049351/article/details/103214324
第二种是
但是这篇博客中也对此进行了说明。
https://blog.csdn.net/a1065712890/article/details/79735006
以上都是错误的,对我们这些刚入门的小白来说,真的是很误导人。
那这个包装类作参数最后没有交换,属于什么问题呢?
就属于它把盒子里的钥匙给换了。
这里有很详细的分析。
https://www.cnblogs.com/gslyyq/p/4950734.html
它跟final修饰类,修饰变量,无关。
解决方法
解决的思路就是确保形参和实参指向同一个对象,且在方法中没有改变形参的指向。
这里利用数组做个演示。还可以通过修改对象的属性来达到这样的目的。
到此解决了我的一些困惑,如果你恰巧看到这里,希望它能对你有所帮助。
以上有所转载。