真正弄懂参数传递
来源:互联网 发布:蒙古骑兵为什么知乎 编辑:程序博客网 时间:2024/05/16 14:50
题记:上午去面试,又见笔试,看着就头疼。试题里有关于参数传递的内容,不好意思,我答错了。以前也看过资料,但理解不深,最后导致今天上午失利,所以下决心搞清楚,理解透彻,翻资料加自己的代码测试,终于懂了。
首先说明:java中,方法参数传递是“引用的拷贝的传递”,也就是说把当前的引用拷贝一份,传递给方法。
下边的是上午的例题:
public class foo{
public void setStr(String str){
str = "welcome!";
}
public static void main(String args[]){
foo f = new foo();
String str = new String("123");//要理解这里是两个对象,一个是栈内存中的123的引用对象,即str的值,
//一个是堆内存在的"123"对象本身。
f.setStr(str);
System.out.println(str);// 这里打出的是什么?我回答:welcome, 你呢?
}
}
回来后自己测试了一下,结果居然是123!
所以很不理解,经过一翻查找,终于知道为什么了:
在调用setStr()方法的时候,只是把当前串“123”的在堆内存中的首地址,比如:0088:2211,即“引用地址”,(也就是str的值,保存在栈内存中)拷贝了一份,把拷贝出的这份传给setStr()方法,注意这句话,这里传的,只是引用地址的拷贝,由于仅仅是一个拷贝,所以在setStr()方法中的赋值操作影响不到main方法在str的内容。
经过分析,认为传的是把当前串值"123"复制一份放到堆中,然后把该堆的引用地址传递给setStr()方法
做了好几年开发了,连这个也不知道,实在是让人脸红!
上一个对象在内存中地址分配图:
- 真正弄懂参数传递
- 这才是真正的JQuery.ajax传递中文参数的解决方法
- 参数传递
- 参数传递
- 参数传递
- 传递参数
- 参数传递
- 参数传递
- 参数传递
- 传递参数
- 参数传递
- 参数传递
- 参数传递
- 参数传递
- *参数传递*
- 参数传递
- 参数传递
- 参数传递
- 浅谈BuildForge中的环境变量的继承关系
- Ubuntu8.10命令行下如何修改时区信息
- 后缀名被删,file识别格式
- CQ Import Tool 简介
- 关于c#实现影音嗅探的问题(转)
- 真正弄懂参数传递
- Java调用Delphi DLL(通过C++调用和直接调用两种方式)
- CSRF攻击原理解析
- 使用 Visual C++ 2008 功能包加强 Windows 应用程序
- 国内十大仪表行业网站提名
- Web设计需要遵循一些准则
- 有关C#开发抓取、分析网络数据包的代码段
- 程序人生----JavaScript引发的思考
- PowerShell: Using Snapins, Startup Files, and Preferences