public void another(ValHold v){
v.i = 20;//这里对原对象中i的值进行了改变,所以后面打印为20
ValHold vh = new ValHold();
v =vh;//这里让v重新指向一个新的对象,并没有改变原来对象;新对象的i值为10
System.out.println(v.i);
}
v.i = 20;//这里对原对象中i的值进行了改变,所以后面打印为20
ValHold vh = new ValHold();
v =vh;//这里让v重新指向一个新的对象,并没有改变原来对象;新对象的i值为10
System.out.println(v.i);
}
}
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
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
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值呢?
这时只是相当于把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了