当前位置:  技术问答>java相关

有谁会这题???

    来源: 互联网  发布时间:2015-08-11

    本文导语:  class ValHold{ public int i = 10; } public class ObParm{ public static void main(String argv[]){ ObParm o = new ObParm(); o.amethod(); } public void amethod(){ int i = 99; ValHold v = new ValHold(); v.i=30; another(v,i); System.out.print( v....

class ValHold{
public int i = 10;
}

public class ObParm{
public static void main(String argv[]){
ObParm o = new ObParm();
o.amethod();
}
public void amethod(){
int i = 99;
ValHold v = new ValHold();
v.i=30;
another(v,i);
System.out.print( v.i );
}//End of amethod

public void another(ValHold v, int i){
i=0;
v.i = 20;
ValHold vh = new ValHold();
v =  vh;
System.out.print(v.i);
System.out.print(i);
}//End of another

}
这段程序问你输出。输出是10020。为什么返回到amethod()后v.i是20而不是10?

|
to azhiking(雪域浪人) :
   你可以把如下两行注释掉,看看结果和你想的是否一致
   
   ValHold vh = new ValHold();
   v =  vh;

这道题重点考的就是这两行.........

|
关键在于java中对于对象所谓的引用调用其实是拷贝了对象的地址,
也就是说:
  当在amethod方法中new了一个ValHold类的实例(v)时,
系统在内存中分配了一块地址给v,设地址为a,
在调用another前,a地址所指的对象v的i=30,
调用another时,系统拷贝了地址a,设为b,即a,b都
指向对象v,即是说在another中访问对象v是通过b,
接下来v.i=20,即通过b访问到v,把i的值改为20,此时v.i=20,
关键在于ValHold vh =new ValHold(),
和v=vh,前者新分配了一个对象vh,他的i值为10,
内存中地址为c;v=vh等价于b=c,就是把原本指向
对象v的地址b的值改为对象vh的地址,
此时b不指向v,而指向vh,此时v.i=20,vh.i=10。
下一句输出v.i其实是输出此时vh.i,等于10,
然后返回到amethod,输出v.i其实是输出此时v.i,
等于20。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。














站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3