Object的问题

oDon 2006-04-01 03:40:59
Given the following code what will be the output?

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.println(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.println(v.i+ " "+i);
}//End of another

}

为什么 答案为 10 0 20
...全文
162 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
benewu 2006-04-02
  • 打赏
  • 举报
回复
楼上正解
public void another(ValHold v, int i){ //这里的VolHold v的v改成其他名字也没关系,为容易说明把它改成public void another(ValHold av, int i),方法只是会传个引用的值进来,然后那个原来的引用就不管了。这时方法中的av的值是v的值,它们指向同一个对象。
ValHold vh = new ValHold();
av = vh; //在这里只是改变了当前方法中的av,原来的v引用没有任何变化。
widegoose_wy 2006-04-02
  • 打赏
  • 举报
回复
对于第一个和第二个结果,答案很明了。

现总结第三个输出结果20的分析:

当我们将一个对象作为参数传递时:public void another(ValHold v, int i)有以下两个结论:
一、可以修改对象v里的成员变量值,并且退出子函数后,依然有效。
二、但是,如果在子函数中修改的是对象的引用(v = vh),退出子函数后,修改就失效了。

因为第一点: 最后一个结果输出的是20,而不是v起初的30
因为第二点: 最后一个结果输出的是20,而不是vh的10
Camelh 2006-04-02
  • 打赏
  • 举报
回复
heihei8() 讲解的是正确的
mss1981 2006-04-02
  • 打赏
  • 举报
回复
我也学习了!很绕人
oDon 2006-04-01
  • 打赏
  • 举报
回复
明白了another传的ValHold v可以为别的标识符
jlu3389 2006-04-01
  • 打赏
  • 举报
回复
传递的是引用。
结果当然是10 0 20啦
longsys 2006-04-01
  • 打赏
  • 举报
回复
不同意楼上的 !!!你自己写一个类试试分别把形式参数 &实际参数(一个对象)的地址都输出来其实他们是指向同一个地址的
zxm0591 2006-04-01
  • 打赏
  • 举报
回复
JAVA中的传递都是值传递,即使对象也是传递值
heihei8 2006-04-01
  • 打赏
  • 举报
回复
谁说没热心人啦~~~
我也是才学java的...
希望我们能成为朋友~`~`~

Given the following code what will be the output?

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.println(v.i);
}//End of amethod

public void another(ValHold v, int i){
i=0;
v.i = 20;//这里将传入的引用所指向的对象的i的值赋为20 所以v.i=20
ValHold vh = new ValHold(); //这里重新创建了一个类的实例vh,其i值为10
v = vh;//这里将新创建类vh的引用赋给了v ,此时v和vh指向同一个对象,所以v.i的值是10
System.out.println(v.i+ " "+i);//局部变量为0
}//End of another

}
//这里一个是按值传递,一个按引用传递.

也不知道自己说清楚了没?
Hmilyl 2006-04-01
  • 打赏
  • 举报
回复
ValHold vh = new ValHold();
v = vh;

oDon 2006-04-01
  • 打赏
  • 举报
回复
没有热心人

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧