test a  = new test();意思是在内存地址中定义了a的对象,并将对象a通过值传递的方式传 给了b,因此b.i=2可修改a的对象。
b=t实际上是将t的内存地址付给了b,此时a与b的内存地址是不相同的所以打印的结果就会不同

解决方案 »

  1.   

    呵呵!这个正是这个原因,所以我才“迷惑”呀。你看,先是打印出bMothed中的结果,后打印出aMothed的结果,正是因为“b=t实际上是将t的内存地址付给了b”,所以我认为:此时的b中就有t的地址。我想这是没错的。那么,在bMothed执行完以后,为什么aMothed中的b的地址还是原来的呢?我看这才是问题的关键。但现在我是百思不得其解。有高手请解答一二。谢谢。
      

  2.   

    实际不难。
    首先Java的参数传递也是传值和传引用混合的。对于简单数据类型是是传值的,对于对象是传引用的。Test是一个类,如果Test作为参数传递时一定是传引用的。
    看aMethod,a保存着Test一个实例的地址,a本身应该是一个整数类型。把实例传递给bMethod时,bMethod也获得了这个实例的地址。但是,JVM传递的是a的值(即实例的地址),也就是说JVM把这个地址复制了一份,再用这个副本去完成函数调用,至于最后又用副本去保存别的地址,对于a本身自然不会有任何影响。在传递是,把b看作a的副本就OK了。
    a----->Test(100)
       | 
       | bMethod(a),设想a本身的一个副本b传到了bMehtod.
       |
    a----->Test(100)
    b----->Test(100)
       | b.i = 2;
    a----->Test(2)
    b----->Test(2)
       |
       | Test t = new Test();
       |
    a----->Test(2)
    b----->Test(2)
    t----->Test(100)
       |
       | b = t;
       |
    a----->Test(2)
    b----->Test(100)
    t----->Test(100)
       |
       |
       |
    Result:a.i=2;b.i=100
      

  3.   

    昨天想了一天,终于明白了,大体上和“netramper(过山风)”说的差不多。我认为每一个函数都会维护自己的独立的“栈”,当“ b  =  t ”时,实际上并没有影响到 aMothed() 中“a”的所持有的“引用”(指针或者说是地址)的值,所以会产生以上的结果。其实,以前我也明白JAVA中传值和传引用的区别,只是没有意识到“每一个函数会维护自己的栈”这一点,所以才会迷惑了一下午。昨天下班在等公交车时,突然一闪,原来是这么会事儿。今天早上来到公司,再看看“netramper(过山风)”的贴,果然和我想的一直。
        看样子,想深入了解JAVA,还得对底层的知识有所了解才行。以前我也学过C++,对指针部会投入的精力比较多。但没有在实际的工作中用到,所以经常会在这种问题上迷惑。
        看样子,还得学学C++呀,不过C++的广博的千变万化语法、和对底层的依赖,实在是难以超越,不知各位有无比较好的方法?
      

  4.   

    应该是下面的解释吧。
    在bMethod(Test b)中,b是a的别名,他们都指向同一个对象,所以对b的操作与对a的操作相同。但对于b=t是把b指向了新的对象t,因此b与a就没有关联了。
    这样的解释我决得更合理