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”为什么会变化?
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的内容。总结:对象是地址传递,换句话说是也叫引用
i=0;
v.i = 20; //此句修改了代入参数v中的域i的值。
ValHold vh = new ValHold();
v = vh;
System.out.print(v.i);
System.out.print(i);
}
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
}
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);
}