java值传递思考
2015-05-29 13:06
337 查看
本文首先发表在:http://www.hikyson.cn/archives/696
本文主要举例说明为什么java是值传递、普通类对象的传递和String类型的传递过程。
先看下代码,很简单
注:hashcode这里就用于表示物理地址。
注:云状图表示堆存储空间,方块表示物理地址存放空间,菱形表示指针。
创建了一个Lilei的Person对象,物理地址为1793467229,认为指针(变量)p,指向该物理地址(也就是p指针的值就是1793467229)。
创建了一个Haimeimei的对象,物理地址为723248511,然后p指针指向了723248511(也就是说,第一步创建的对象没有指针指向它了,理论上说,它可以被垃圾回收机制回收,当然,没有回收之前的Haimeimei对象还是存在在堆存储中的)。
这时候执行了一个change方法,把p指针的值作为参数传递进去,这时候我们打印结果是723248511,也就是和p的指向的物理地址相同,注意!虽然物理地址相同,可这两个指针其实是不一样的,我们可以认为这个新的指针叫pNew。
然后和前面一样,创建Lucy对象,物理地址:880282357,这时候pNew的值就是880282357
到这里其实就分析完毕了,当然上面讲的是普通的一个类对象(Person),下面按这个思路来看看String类对象的传递。
然后执行change方法,新建一个Haimeimei对象,物理地址为456,让p变量的值副本(当作一个新的指针p2)指向456。
执行完change后打印p的name字段,应该是多少?答案是:Lilei。因为p的值,也就是物理地址没变过,是123,而123的物理地址在堆中的对象就是“Lilei”。
本文主要举例说明为什么java是值传递、普通类对象的传递和String类型的传递过程。
先看下代码,很简单
Person类
[code]public class Person { public String name; public Person(String name) { this.name = name; } }
测试方法:
[code]public static void test() { Person p = new Person("Lilei"); System.out.println("PersonLilei : " + p.hashCode()); p = new Person("Haimeimei"); System.out.println("PersonHaimeimei : " + p.hashCode()); change(p); System.out.println("PersonAfterChange : " + p.hashCode()); } public static void change(Person pNew) { System.out.println("PersonBeforeChange : " + pNew.hashCode()); pNew = new Person("Lucy"); System.out.println("PersonLucy : " + pNew.hashCode()); }
注:hashcode这里就用于表示物理地址。
运行结果
注:云状图表示堆存储空间,方块表示物理地址存放空间,菱形表示指针。
分析
创建了一个Lilei的Person对象,物理地址为1793467229,认为指针(变量)p,指向该物理地址(也就是p指针的值就是1793467229)。
创建了一个Haimeimei的对象,物理地址为723248511,然后p指针指向了723248511(也就是说,第一步创建的对象没有指针指向它了,理论上说,它可以被垃圾回收机制回收,当然,没有回收之前的Haimeimei对象还是存在在堆存储中的)。
这时候执行了一个change方法,把p指针的值作为参数传递进去,这时候我们打印结果是723248511,也就是和p的指向的物理地址相同,注意!虽然物理地址相同,可这两个指针其实是不一样的,我们可以认为这个新的指针叫pNew。
然后和前面一样,创建Lucy对象,物理地址:880282357,这时候pNew的值就是880282357
到这里其实就分析完毕了,当然上面讲的是普通的一个类对象(Person),下面按这个思路来看看String类对象的传递。
String类型传递
代码
[code]public static void test() { String p = "Lilei"; change(p); System.out.println("p : " + p.name); } public static void change(String p2) { p2 = "Haimeimei"; }
分析
在堆中创建一个String对象“Lilei”,物理地址假设为123,p变量的值就是123。然后执行change方法,新建一个Haimeimei对象,物理地址为456,让p变量的值副本(当作一个新的指针p2)指向456。
执行完change后打印p的name字段,应该是多少?答案是:Lilei。因为p的值,也就是物理地址没变过,是123,而123的物理地址在堆中的对象就是“Lilei”。
相关文章推荐
- Java 的 HTML 解析器
- Java枚举类用法实例
- POI 注解方式 导入导出 excel , 只依赖于 POI包
- eclipse代码软件自动生成uml类图
- java.lang.IllegalStateException: no found the liblocSDK4d.so file, please correct settings
- java基础整理——父类引用指向子类对象实体的多态
- Java基于socket实现简易聊天室实例
- MyEclipse 2015优化技巧
- java虚拟机精讲 读后
- Java实现Socket的TCP传输实例
- hdu 2042 不容易系列之二 (java)
- 通过eclipse直接打断点调试程序
- JAVA 距离某个时间的秒数
- hdu 2099 整除的尾数 (java)
- Java单例模式几种写法
- Java获取时间年、月、日的方法
- hdu 2040 亲和数 (java)
- hdu 2039 三角形 (java)
- Java-->反射的用法(新手都能入门)
- hdu 2041 超级楼梯(java)