返回信息流请看下面一段小程序:
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用了赋值,这两个结果怎么不类似啊!大神求解释
这是一条镜像帖。来源:北邮人论坛 / java / #42094同步于 2015/6/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
java关于对象的引用问题
dongqing
2015/6/26镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这个swap函数根本不能达到赋值的目的。在堆中初始化了Person,但是当把这个person传入方法的时候,实际上传入的是该Persion的一个复制,也就是引用,并不是Persion的本身。因此你只是把这个副本a变成了堆上b的副本,当返回之后,这些副本失效。在堆上依然是a是a,b是b。
这和person3 = person4有什么区别吗?不都是引用吗,返回时为什么会失效啊!
【 在 sj09211463 的大作中提到: 】
: 这个swap函数根本不能达到赋值的目的。在堆中初始化了Person,但是当把这个person传入方法的时候,实际上传入的是该Persion的一个复制,也就是引用,并不是Persion的本身。因此你只是把这个副本a变成了堆上b的副本,当返回之后,这些副本失效。在堆上依然是a是a,b是b。
【 在 dongqing 的大作中提到: 】
: 这和person3 = person4有什么区别吗?不都是引用吗,返回时为什么会失效啊!
问题就是,当你把一个对象传入的方法中去,这个传入的参数就不再指向对象本身了,而是一个复制品。
而Persion3和4直接指向的对象本身,因此直接改变。不知我说明白没。。
似乎有所明白,谢谢啦!
【 在 sj09211463 的大作中提到: 】
: 问题就是,当你把一个对象传入的方法中去,这个传入的参数就不再指向对象本身了,而是一个复制品。
: 而Persion3和4直接指向的对象本身,因此直接改变。不知我说明白没。。
如果函数的参数是对象或者数组时,实参到形参是引用传递,两者指向共同的堆空间,但是在函数体内部只是对形参进行了赋值,并没有改变实参和实际堆空间,虽然形参指向了共同的堆空间,但是实参还是指向了各自的堆空间,因此你在使用实参输出的时候就是显示各自的堆空间内容了。
恩恩,越来越明白了!
【 在 xs90 的大作中提到: 】
: 如果函数的参数是对象或者数组时,实参到形参是引用传递,两者指向共同的堆空间,但是在函数体内部只是对形参进行了赋值,并没有改变实参和实际堆空间,虽然形参指向了共同的堆空间,但是实参还是指向了各自的堆空间,因此你在使用实参输出的时候就是显示各自的堆空间内容了。