一道方法参数相关题

发表于:2007-07-01来源:作者:点击数: 标签:
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(
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
}
/*
1) 10,0, 30
2) 20,0,30
3) 20,99,30
4) 10,0,20

程序执行的两句输出语句的顺序是
System.out.println(v.i+ " "+i);
//in public void another(ValHold v, int i)

System.out.println(v.i);
//in public void amethod()

看上面一句输出System.out.println(v.i+ " "+i)之前的语句,
ValHold vh = new ValHold();
//new了一块空间,vh为指向这块空间的引用,这块空间所存储的i值为10

v =  vh;
//将对刚才的空间的引用赋值给v,现在v所指的空间合vh相同,就是刚才new得到的,所以v.i的值为10

第一条输出语句输出为10,0

再来看第二条输出语句,记住一点java方法的传值是by value的。
传入一个对ValHold类的引用,这个引用本身在方法结束后不会改变(就是它所指的空间不会改变),
能改变的是引用所指空间中的变量的值,
public void another(ValHold v, int i)中的语句v.i = 20;就是改变的传入引用所指的空间中的变量i的值,
所以第二句输出语句执行时,引用v所指空间的i值已经变成20,所以输出为20

最后总的输出就是10,0,20

*/  

原文转自:http://www.ltesting.net