A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 魏昂 黑马帝   /  2012-3-16 14:09  /  1958 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);
               
        }
}
为什么 最后的结果会是 李四呢? 求解

5 个回复

倒序浏览
因为person和person2是指向同一个对象,首先你把这个对象的名字改为张三,然后再改为李四。
回复 使用道具 举报
Person person2 = person;
这句话是吧person的引用给了person2, 你修改person2的时候就是在修改person
你把 public void change(Person person,Person person)
中的两行代码换下位置结果就不一样。
回复 使用道具 举报
传入change()的person和person2指向一个对象,不管你在主函数中怎么赋值,对于change没有影响;当执行person.name = "张三";时,person指向的对象中的值是张三,在执行person2.name = "李四";时,person2指向的对象中的值是李四。只要person和person指向的是一个对象,输出person,值一直都是李四。
回复 使用道具 举报
额,这个问题严格来讲应该不算是参数传递的问题,它是一个地址赋值的问题。你或许没有分清楚地址的传递过程吧。
首先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 15:51
额,这个问题严格来讲应该不算是参数传递的问题,它是一个地址赋值的问题。你或许没有分清楚地址的传递过程 ...

嗯 谢谢 嘿嘿
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马