黑马程序员技术交流社区

标题: 一个关于参数传递的问题 [打印本页]

作者: 魏昂    时间: 2012-3-16 14:09
标题: 一个关于参数传递的问题
public class ParamTest
{
        public void change(Person person,Person person)
        {
                person.name = "张三";
                person2.name = "李四";
        }
       
        public static void main(String[] args)
        {
               
                Person person = new Person();
                person.name = "王五";
                Person person2 = person;
               
                ParamTest test = new ParamTest();
                test.change(person,person2);
               
                System.out.println(person.name);
               
        }
}
为什么 最后的结果会是 李四呢? 求解
作者: 蒙武辉    时间: 2012-3-16 14:27
因为person和person2是指向同一个对象,首先你把这个对象的名字改为张三,然后再改为李四。
作者: 张希强    时间: 2012-3-16 14:30
Person person2 = person;
这句话是吧person的引用给了person2, 你修改person2的时候就是在修改person
你把 public void change(Person person,Person person)
中的两行代码换下位置结果就不一样。
作者: 李中豪    时间: 2012-3-16 15:29
传入change()的person和person2指向一个对象,不管你在主函数中怎么赋值,对于change没有影响;当执行person.name = "张三";时,person指向的对象中的值是张三,在执行person2.name = "李四";时,person2指向的对象中的值是李四。只要person和person指向的是一个对象,输出person,值一直都是李四。

作者: 张润政    时间: 2012-3-16 15:51
额,这个问题严格来讲应该不算是参数传递的问题,它是一个地址赋值的问题。你或许没有分清楚地址的传递过程吧。
首先person.name = "王五";   我们来假设这个名叫王五的person的地址值是12345,后来你又执行了Person person2 = person;    这条语句又将person的地址12345赋值给了person2,那么它的地址也是123454(注意,person2是一个Person类的引用,它是被person给赋值初始化的,并不是new了一新的对象)
然后test.change(person,person2);person.name = "张三";person2.name = "李四";   这条语句又开始跟jvm说了:那个jvm啊,你把12345这个地址里头住的人给我改个名字叫张三。。。后来它又该注意了,不行,你还是把12345里头住的这个人的名字改成李四吧。然后你就你就打印了一下他的名字。。。哇@!@!  果真是李四!

呵呵,笑纳!




作者: 魏昂    时间: 2012-3-16 16:46
张润政 发表于 2012-3-16 15:51
额,这个问题严格来讲应该不算是参数传递的问题,它是一个地址赋值的问题。你或许没有分清楚地址的传递过程 ...

嗯 谢谢 嘿嘿




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2