黑马程序员技术交流社区

标题: 很绕的小问题 [打印本页]

作者: 李敬    时间: 2012-8-25 17:56
标题: 很绕的小问题
class Demo{
    int i = 10;
    public static void value(Demo d){
        d.i = 20;
        Demo d1 = new Demo();
        d = d1;
        System.out.println(d.i);
    }
    public static void main(String [] args){
            Demo d = new Demo();
        value(d);
        System.out.println(d.i);
    }
}

为什么是
10
20
我怎么看都是
20
10
求解答
作者: 唐杨老师    时间: 2012-8-25 18:24
[Fly] 希望能帮到楼主 [/Fly]


作者: 刘源    时间: 2012-8-25 18:50
本帖最后由 刘源 于 2012-8-25 19:07 编辑

public class Demo{
    int i = 10;
    public static void value(Demo d){
        d.i = 20;//第三步,这里d.i=20。将地址d中的变量i赋值为20.
        Demo d1 = new Demo();//第四步,然后你创建d1,但d1.i=10,没错把。
        d = d1;//第五步,你将d1地址给了d.所以选择d和d1都指向d1.i=10.
        System.out.println(d.i);//第六步  ,所以打印d.i=d1.i=10。
    }
    public static void main(String [] args){
            Demo d = new Demo();//第一步
        value(d);//第二步,注意当这一步执行完后因为d1是方法中定义的所以d1地址就不存在了。所以选择d又回到以前的地址。
        System.out.println(d.i);//第七步,因为现在是执行主函数中的d的地址,即d.i=20.
    }
}

作者: 侯林林    时间: 2012-8-25 18:59
class Demo{
     int i = 10;
     public static void value(Demo d){
         d.i = 20;
         Demo d1 = new Demo();
         d = d1;          //将d1所在内存空间的地址值传给d,即d便代表了d1,因为dl只是实例化对象了,并没有改变类中成员变量的值
         System.out.println(d.i);    //因而此打印出的是没有变化过的值10
     }
     public static void main(String [] args){
             Demo d = new Demo();
         value(d);     //调用value函数 得出的值为10
         System.out.println(d.i);    //此处的d为这个主函数中的Demo d = new Demo();  因为d中的成员值在调用value函数的时候被改成了20,所以打印出结果为20
     }
}

作者: 全海波    时间: 2012-8-25 19:02

作者: 王自强    时间: 2012-8-25 19:39
class Demo{
    int i = 10;
    public static void value(Demo d){
        d.i = 20;
        Demo d1 = new Demo();//新的对象d1,分配了新的地址值。d1的属性值i为10
        d = d1;//让d指向了新的地址值即d1的地址值,现在d和d1完全相同了。
        System.out.println(d.i);//所以d.i即为d1.i,为10
    }
    public static void main(String [] args){
        Demo d = new Demo();
        value(d);//打印的是d1的属性值,value把d值传过去,在value内部把d的属性值改变了
                //所以下一步输出的是d的新的属性值,即20
                System.out.println(d.i);//打印的是d的新的属性值。
    }
}


作者: 王得新    时间: 2012-8-25 23:48
看明白了,论坛都是牛人啊





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