public void another(ValHold v){
v.i = 20;//这里对原对象中i的值进行了改变,所以后面打印为20
ValHold vh = new ValHold();
v =vh;//这里让v重新指向一个新的对象,并没有改变原来对象;新对象的i值为10
System.out.println(v.i);
}

解决方案 »

  1.   

    class ValHold {    public int i = 10;
    }
    public class ObParm {    public void amethod() {        ValHold v = new ValHold();// step 1
            another(v);//step 2
            System.out.println(v.i);//step 7
        }    public void another(ValHold v) {        v.i = 20;//step 3
            ValHold vh = new ValHold();//step 4
            v = vh;//step 5
            System.out.println(v.i);//step 6
        }    public static void main(String[] argv) {        ObParm o = new ObParm();
            o.amethod();
        }
    }-----------------------------------------------
    // step 1: 得到 ValHold 对象 v,v 在内存中获得地址。此时,对象 v 中变量 i 的值为 10
    // step 2: 传入 ValHold 对象 v。此时,对象 v 中变量 i 的值为 10
    // step 3: 更改 ValHold 对象 v 中变量 i 的值 为 20
    // step 4: 得到 ValHold 对象 vh,vh 在内存中获得地址。此时,对象 vh 中变量 i 的值为 10
    // step 5: 将 vh 对象赋值给对象 v。此时,v 获得的为 vh 的 reference,v 指向 vh 在内存中的地址,但并为改变对象 v 本身
    // step 6: 打印对象 v 中的变量 i。实际得到的是 reference 中 i 的值,即对象 vh 中变量 i 的值,输出 10
    // step 7: 打印对象 v 中的变量 i。打印的为 v 本身 i 的值,在 step 3 中已经更改为 20,输出 20
      

  2.   

    借光:路过的各位,帮忙看看这几个帖子,看怎么解决;)谢谢啦!关于客户端页面从数据库中读取大量图片的问题
    http://community.csdn.net/Expert/TopicView3.asp?id=4816106乱码还原问题!
    http://community.csdn.net/Expert/TopicView3.asp?id=4813786关于javabean反射代理的问题
    http://community.csdn.net/Expert/TopicView3.asp?id=4813935
      

  3.   

    to 
     emin_lee()  ,// step 1: 得到 ValHold 对象 v,v 在内存中获得地址。此时,对象 v 中变量 i 的值10
    // step 2: 传入 ValHold 对象 v。此时,对象 v 中变量 i 的值为 10
    // step 3: 更改 ValHold 对象 v 中变量 i 的值 为 20
    // step 4: 得到 ValHold 对象 vh,vh 在内存中获得地址。此时,对象 vh 中变量 i 的值为 10
    // step 5: 将 vh 对象赋值给对象 v。此时,v 获得的为 vh 的 reference,v 指向 vh 在内存中的地址,但并为改变对象 v 本身
    // step 6: 打印对象 v 中的变量 i。实际得到的是 reference 中 i 的值,即对象 vh 中变量 i 的值,输出 10
    // step 7: 打印对象 v 中的变量 i。打印的为 v 本身 i 的值,在 step 3 中已经更改为 20,输出 20在step7中,打印的为v本身的i值??这句话不理解,此时v本身与v获得的为vh的refrence有什么关系?即然你在step5中说了v 获得的为 vh 的 reference,v 指向 vh 在内存中的地址,那为什么step打印不是refrence的对象的i值呢?
      

  4.   

    这是传参还是传值的问题,你可以用google搜一下,有很多文章和例子的。
      

  5.   

    当ObParm程序执行到:another(v);时,把V传给another(ValHold v)
    这时只是相当于把V的引用地址copy一份给another的ValHold v,
    所以这时another的v也是指向ObParm里面的v的值,接下来在
    another(ValHold v)里面调用v.i=20;实际上相当于改变了ObParm中的v
    的值,再在another(ValHold v)中执行ValHold vh = new ValHold();相当
    在内存中重新开辟一个空间,这时把vh赋给v时,这时的v就指向了新开辟的
    空间的地址,输出v.i时就是10,返回到ObParm时,输出v.i就是20了