您的位置:首页 > 其它

关于引用传递的个人理解

2016-02-26 11:59 393 查看
相信还有很多和我一样的编程小白遇到过这样的问题:

public static void main(String[] args){
String str ="abcd";
change(str);
System.out.println(str); //第一个位置
str = "cc";
System.out.println(str); //第二个位置
}
public static void change(String s){
s = "cc";
}
在第一个位置会输出:abcd
在第二个位置会输出:cc
第二个位置的输出我们不难理解,但是第一个位置我明明调用了change方法对于字符串d值进行了修改,但是为什么回到main函数进行打印的时候,却并没有发生修改呢?
对于这样的情况需要从内存空间的分配上面去理解一下:
String str ="abcd";
这条语句创建了一个新的对象str,并且str的地址指向了堆内存中的"abcd"



接下来调用change方法,并且传入参数str,change方法中的变量s此时指向"abcd"



在change方法中进行了操作,将s指向了"cc"



此时打印str,我们自然发现str指向的还是abcd。

我们再看下面的代码:
首先我创建一个类Chestnuts,它具有一个参数str:
class Chestnuts {
Stringstr;
}
然后在main函数中进行了如下操作:
public static void main(String[] args){
Chestnutscn = new Chestnuts();
cn.str= "abcd";
System.out.println(cn.str); //第一个位置
change(cn);
System.out.println(cn.str); //第二个位置
}
publicstatic void change(Chestnuts c){
c.str= "cc";
}
在第一个位置打印:abcd
在第二个位置打印:cc
那么为什么这样操作就能够对于对象cn的str属性进行修改呢?我们同样从内存分配的角度去观察:
首先,在创建了Chestnuts类的对象cn,并且将cn的str属性赋值为"abcd"之后,内存的状态是这样的:



在调用change方法时,将cn作为参数传入,在change方法运行的内部,变量c指向了cn所指向的Chestnuts实例:



当change方法内执行c.str = "cc"操作时,发生了如下变化:



注意:这个时候c所指向的地址仍然是cn所指向的Chestnuts实例,所做的str参数修改可以看作是该Chestnuts内部的操作。
所以,当再次打印cn的str属性时,我们发现它发生了修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: