当前页面: 开发资料首页 → J2EE 专题 → 为什么这个程序的结果是这样的?
为什么这个程序的结果是这样的?
摘要: 为什么这个程序的结果是这样的?
class ValHold{
public int i = 10;
}
public class ObParm{
public void amethod(){
ValHold v = new ValHold();
another(v);
System.out.println(v.i);
}
public void another(ValHold v){
v.i = 20;
ValHold vh = new ValHold();
v =vh;
System.out.println(v.i);
}
public static void main(String[] argv){
ObParm o = new ObParm();
o.amethod();
}
}此题的答案是10,20,为什么不是10,10呢?
ding
public void another(ValHold v){
v.i = 20;//这里对原对象中i的值进行了改变,所以后面打印为20
ValHold vh = new ValHold();
v =vh;//这里让v重新指向一个新的对象,并没有改变原来对象;新对象的i值为10
System.out.println(v.i);
}
实际上,这个问题好比在c/c++中,在函数调用中,改变指针变量本身与改变指针所指向的对象是一样的道理
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
借光:
路过的各位,帮忙看看这几个帖子,看怎么解决;)谢谢啦!
关于客户端页面从数据库中读取大量图片的问题
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
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值呢?
这是传参还是传值的问题,你可以用google搜一下,有很多文章和例子的。
当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了