人无远虑,必有近忧,希望我们永远不要停下前进的脚步!
前言
提示:在继续阅读之前请确认
1.你已经从事或者了解过Java语言开发
2.你已经了解了值传递,引用传递的概念
3.本文旨在让你彻底明白Java中为什么是值传递,如醍醐灌顶般
提示:以下是本篇文章正文内容
一、为什么会搞不清楚值传递和引用传递?
咱别的先不多说,举个例子:String str = “同花顺” ,看图,str中保存着“同花顺”所在内存中的地址,也就是说str持有“同花顺"的引用:
我们都知道将字符串str作为参数传递给函数去调用的时候,str传递的就是“同花顺”所在内存中的地址,也就是传递的是对字符串“同花顺”的引用。
那问题来了,这不是引用传递吗?
Java为什么会嘴硬的说是值传递呢?
别急,我们看示例代码下边的图,和上边的图进行对比
/**
* @author top
*/
public class Test {
public static void main(String[] args) {
String str = "同花顺";
sayHello(str);
}
static void sayHello(String arg) {
System.out.println("hello" + arg);
}
}
如图所示,我们所说的引用传递中的引用到底是引用1,还是引用2呢?
也就是我们说的引用传递,值传递的主语到底是谁?
其实我们所说的引用传递的引用指的是对str的引用而不是对字符串"同花顺"的引用,我们所说的值传递的值指的也是str所保存的地址值
所以这也就揭示了为什么在函数中如果对参数进行修改,不会影响到实际参数:
/**
* @author top
*/
public class Test {
public static void main(String[] args) {
String str = "同花顺";
updateStr(str);
System.out.println(str); // 输出结果是: 同花顺
}
static void updateStr(String arg) {
arg = "顺子";
}
}
因为此时函数中的arg指向的不是str,而是str的一个copy,而这个copy里保存的值是指向"同花顺"字符串的引用(也可以说是"同花顺"字符串的地址),当arg改变指向的地址中的值时,不会影响到原来的str。
所以从侧面证明了Java中是值传递,而不存在引用传递,也就是不存在图中的引用1。
所以你明白了吗?