站内搜索: 请输入搜索关键词

当前页面: 开发资料首页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了


↑返回目录
前一篇: 请问hibernate中如何同时向一对多的两个表中插入数据?
后一篇: 小问题~~~~大家来看看!~~~~~~~~~~~~~~~~~~~~~~~~谢谢~~