class ValHold{
public int i=10;
}
public class ObParm{
public void amethod(){
int i=99;
ValHold v= new ValHold();
v.i=30;
another(v,i);
System.out.println(v.i);
}
public void another(ValHold v,int i){
i=0;
v.i=20;
ValHold vh=new ValHold();
v=vh;
System.out.println(v.i+" "+i);
} public static void main(String arg[]){
ObParm o= new ObParm();
o.amethod();
}
}输出结果是 10 0 20
前面10 0 可以理解
但是 最后为什么会输出20
v=vh不是应该v引用vh的地址了么?
public int i=10;
}
public class ObParm{
public void amethod(){
int i=99;
ValHold v= new ValHold();
v.i=30;
another(v,i);
System.out.println(v.i);
}
public void another(ValHold v,int i){
i=0;
v.i=20;
ValHold vh=new ValHold();
v=vh;
System.out.println(v.i+" "+i);
} public static void main(String arg[]){
ObParm o= new ObParm();
o.amethod();
}
}输出结果是 10 0 20
前面10 0 可以理解
但是 最后为什么会输出20
v=vh不是应该v引用vh的地址了么?
对于引用类型而言 形参所引对象内容的改变能改变实参引用对象
但引用本身的改变(v = vh) 对实参是没有影响的 它们彼此独立
一个是amethod里面的v
另一个是another里面的参数 v在里面将v.i设置为20
然后参数的v指向了另一个vh
但此时,amethod里面的v依然指向了原来的v所以 = 20
输出 20
public void another(ValHold v,int i){
i=0;
v.i=20; 这里的v和amethod()中的v指向同一个对象,但不是同一个v,在这里它将对象的i变成了20
ValHold vh=new ValHold();
v=vh;
System.out.println(v.i+" "+i);
} ValHold v,int i是这个函数的局部变量,这个函数结束后,这两个变量就会消失,但那个对象不会消失。将参数的名字变一下,可以帮助你理解。class ValHold{
public int i=10;
}
public class ObParm{
public void amethod(){
int i=99;
ValHold v= new ValHold();
v.i=30;
another(v,i);
System.out.println(v.i);
}
public void another(ValHold a,int i){
i=0;
a.i=20;
ValHold vh=new ValHold();
a=vh;
System.out.println(a.i+" "+i);
} public static void main(String arg[]){
ObParm o= new ObParm();
o.amethod();
}
}