关注我,每天三分钟,轻松掌握一个Java知识点。
Java里方法的参数传递方式只有一种:值传递。
所谓值传递,就是讲实际参数的影分身传入到方法内,而参数本身不会发生任何变化。
可以理解为你在画图工具上画了一个图,再复制一份,你对复制品的任何涂改不会影响之前原版的画。
类比到代码中如下:
上述代码执行结果:
我们可以看到,在调用了swap方法候,main方法中的a、b值并未受到影响,这是为什么呢?
因为在main方法传递a、b给swap的时候,传递的是a、b的复制品,复制品在swap中怎么折腾,main方法中的本体完全不受影响,甚至还有点想笑。
有的同学可就说了,不对,我平时传对象进方法,然后给对象各种操作再出来,对象里面的属性值全变了,这怎么解释?
解释这个问题之前,我想先说两个基本概念:基本类型和引用类型。
基本类型:
江湖人称“四类八种”:
1)四种整数类型(byte、 short 、int、 long )
2)两种 浮点数 类型( float 、 double )
3)一种字符类型( char )
4)一种布尔类型( boolean )
引用类型:对象在一个叫堆的地方,我把它在堆里的地址写一个牌牌,这个牌牌能带我找到住在堆里的对象,这就是引用类型。
接下来我们聊聊他们都住在虚拟机的哪:
如图,基本类型和值,都存在一个叫栈的地方,而新建的对象,存在一个叫堆的地方,如果你使用它,就得有一个引用类型(牌牌)带你去,而上面同学问的问题答案就在这里面。
实际上你在方法中传递引用的时候,引用也跟上面的ab和熊喵一样,被复制了两份,也就是说另一个栈中也有一份panda和banana。
你在方法中拿到了panda这个牌牌,你就可以找到堆里的同一个对象,你霍霍这个对象,本地指向的也是这个对象,所以出现了你感觉上是把对象传给了方法让它霍霍了一样,实际上传递的还是栈中的副本。
执行结果为:
这里可以看出,对象中的属性ab的值被置换了,就是原版tSwap和传入方法总的复制品tSwap都是指向了堆中的Swap对象。
小伙伴们理解了吗?
以上就是今天分享的全部内容了,创作不易,希望大家多多关注,收藏,评论支持,谢谢大家!