关于引用传递的个人理解
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属性时,我们发现它发生了修改。
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属性时,我们发现它发生了修改。
相关文章推荐
- 图形化的Redis监控系统redis-stat安装
- 感悟--不可抗拒的行为
- C语言宏定义和宏定义函数
- ios 工厂模式
- 安卓中文件读写操作的笔记
- php随机字符串
- xcode 配置系统环境变量 Preporocessing 预编译宏的另一种写法, 系统的DEBUG 由来
- iOS block的理解
- raw_input() 与 input() __ Python
- OkHttp 使用指南(四)--Recipes
- 【js笔记】js动态显示文本框可输入字数
- 三组I/O复用函数的比较
- Erlang 程序设计 学习笔记(二) 模块与函数
- php+js 瀑布流源码
- Andriod studio 中启动模拟器出现Cannot launch AVD in emulator
- AsyncDisplayKit入门指南
- Leet Code OJ 136. Single Number
- Java并发编程(一)
- form 表的post提交,其中一个超多数据的input标签在后台获取数据被截断的解决方法
- iOS开发解决UITableViewCell和添加侧滑手势冲突的问题