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 );
}
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);
}
}大案是:10020.请问为什么不是10030?在amethod()中的“v.i”为什么会变化?

解决方案 »

  1.   

    在another(ValHold v, int i)函数中你修改了v.i的值
      

  2.   

    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);
    }
    }
    这里的参数v,接受了another(v,i);里的的v传过来的地址。
    而在another 方法里有句v.i = 20; 这句话改变了another(v,i);里的的v传过来的地址,下的v.i的内容。总结:对象是地址传递,换句话说是也叫引用
      

  3.   

    public void another(ValHold v, int i){
    i=0;
    v.i = 20; //此句修改了代入参数v中的域i的值。
    ValHold vh = new ValHold();
    v =  vh;
    System.out.print(v.i);
    System.out.print(i);
    }
      

  4.   

    public void amethod(){
    int i = 99;
    ValHold v = new ValHold();
    v.i=30;
    another(v,i);
    System.out.print( v.i );  // 这里是第三个输出:20,为什么?见下面的注释2。注释2下面的赋值语句执行后,那里的“v”已经跟这里的v没有关系了。
    }
    public void another(ValHold v, int i){
    i=0;                      // 1、就是这里啦,赋值为0!!!!
    v.i = 20;                 // 2、这里赋值为20!!!!
    ValHold vh = new ValHold();
    v =  vh;
    System.out.print(v.i);    // 这里是第一个输出:10,因为这里的v是新生成的,所以他的i被初始化为10
    System.out.print(i);      // 这里是第二个输出:0,因为上面备赋值为0,见上面的注释1
    }
      

  5.   

    在方法体another中 ValHold中的i被更改为20
    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);
    }