BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #42094同步于 2015/6/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

java关于对象的引用问题

dongqing
2015/6/26镜像同步10 回复
请看下面一段小程序: package com.demo; class Person{ private String name; private int age; public Person(String name){ this.name = name; } public static void swap(Person a, Person b){ a = b; } public String toString(){ return "name " + this.name; } } public class Demo { public static void main(String[] args) { Person person1 = new Person("张三"); Person person2 = new Person("李四"); Person person3 = new Person("王五"); Person person4 = new Person("李六"); Person.swap(person1, person2); person3 = person4; System.out.println( person1.toString()); System.out.println( person2.toString()); System.out.println( person3.toString()); System.out.println( person4.toString()); } } 输出结果是: name 张三 //这个为什么不是李四 name 李四 name 李六 name 李六 这里我的问题是person1为什么没有指向person2呢?person1和person2利用了swap(Person a, Person b)方法, 而person3和person4用了赋值,这两个结果怎么不类似啊!大神求解释
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
sj09211463机器人#1 · 2015/6/26
这个swap函数根本不能达到赋值的目的。在堆中初始化了Person,但是当把这个person传入方法的时候,实际上传入的是该Persion的一个复制,也就是引用,并不是Persion的本身。因此你只是把这个副本a变成了堆上b的副本,当返回之后,这些副本失效。在堆上依然是a是a,b是b。
dongqing机器人#2 · 2015/6/26
这和person3 = person4有什么区别吗?不都是引用吗,返回时为什么会失效啊! 【 在 sj09211463 的大作中提到: 】 : 这个swap函数根本不能达到赋值的目的。在堆中初始化了Person,但是当把这个person传入方法的时候,实际上传入的是该Persion的一个复制,也就是引用,并不是Persion的本身。因此你只是把这个副本a变成了堆上b的副本,当返回之后,这些副本失效。在堆上依然是a是a,b是b。
nuanyangyang机器人#3 · 2015/6/26
swap只修改了swap函数里面的局部变量a(形式参数),但没有改变person1(实际参数)
sj09211463机器人#4 · 2015/6/26
【 在 dongqing 的大作中提到: 】 : 这和person3 = person4有什么区别吗?不都是引用吗,返回时为什么会失效啊! 问题就是,当你把一个对象传入的方法中去,这个传入的参数就不再指向对象本身了,而是一个复制品。 而Persion3和4直接指向的对象本身,因此直接改变。不知我说明白没。。
lixing机器人#5 · 2015/6/26
月经贴
lovena机器人#6 · 2015/6/26
Java不能实现swap函数,很遗憾..
dongqing机器人#7 · 2015/6/26
似乎有所明白,谢谢啦! 【 在 sj09211463 的大作中提到: 】 : 问题就是,当你把一个对象传入的方法中去,这个传入的参数就不再指向对象本身了,而是一个复制品。 : 而Persion3和4直接指向的对象本身,因此直接改变。不知我说明白没。。
xs90机器人#8 · 2015/6/29
如果函数的参数是对象或者数组时,实参到形参是引用传递,两者指向共同的堆空间,但是在函数体内部只是对形参进行了赋值,并没有改变实参和实际堆空间,虽然形参指向了共同的堆空间,但是实参还是指向了各自的堆空间,因此你在使用实参输出的时候就是显示各自的堆空间内容了。
dongqing机器人#9 · 2015/6/29
恩恩,越来越明白了! 【 在 xs90 的大作中提到: 】 : 如果函数的参数是对象或者数组时,实参到形参是引用传递,两者指向共同的堆空间,但是在函数体内部只是对形参进行了赋值,并没有改变实参和实际堆空间,虽然形参指向了共同的堆空间,但是实参还是指向了各自的堆空间,因此你在使用实参输出的时候就是显示各自的堆空间内容了。