class ValHold{
public int i = 10;
}public class ObParm{
public void amethod(){
ValHold v = new ValHold();
another(v);
System.out.println(v.i);
} public void another(ValHold v){
v.i = 20;
ValHold vh = new ValHold();
v =vh;
System.out.println(v.i);
} public static void main(String[] argv){
ObParm o = new ObParm();
o.amethod();
}
}
为什么是
10
20
谢谢!!
public int i = 10;
}public class ObParm{
public void amethod(){
ValHold v = new ValHold();
another(v);
System.out.println(v.i);
} public void another(ValHold v){
v.i = 20;
ValHold vh = new ValHold();
v =vh;
System.out.println(v.i);
} public static void main(String[] argv){
ObParm o = new ObParm();
o.amethod();
}
}
为什么是
10
20
谢谢!!
所以是20;新new的对象vh的属性i却没有被重新赋值,所以是10;
System.out.println(v.i);输出20,因为这是原来的i
v.i = 20;
ValHold vh = new ValHold();
v =vh;
System.out.println(v.i);
}
v是another的局部变量,指向传递过来的对象,
要注意的是
2. public void amethod(){
ValHold v = new ValHold();
another(v);
System.out.println(v.i);
}这个V对象有两个引用副本,一个是2方法里的V,另一个是1方法里的V,着两个变量作为独立的变量存储在1和2的局部变量表里LocalVariableTable,此时他指向的是方法里的对象,修改v.i就是原来对象的值,但v =vh;使V又指向了新对象vh(其实他是方法1的局部变量),System.out.println(v.i);打印的当然是vh的默认i值10,当从方法1返回到方法2时,这时的V是不同的了,此时v.i已经是20了!
所以是20;新new的对象vh的属性i却没有被重新赋值,所以是10;
首选要知道another(ValHold v)里面的v是amethod()里的v,这里把20赋给v的i(也就是说它赋给amethod里的v.i赋了20)。所以amethod()里的结果是20。再回到another(),下面new了ValHold对象vh再赋给了v(这时的v,其实就是ValHold)因此another()里的System.out是ValHold里的i值
public int i = 10;
}public class ObParm{
public void amethod(){
ValHold v = new ValHold();
v.i = 20;
ValHold vh = new ValHold();
v =vh;
System.out.println(v.i);
System.out.println(v.i);
}
public static void main(String[] argv){
ObParm o = new ObParm();
o.amethod();
}
}其实的你代码跟这个一样的,这样看不是就很明白了
class ValHold{
public int i = 10;
}public class ObParm{
public void amethod(){
ValHold v = new ValHold();
v.i = 20;
System.out.println(v.i);
ValHold vh = new ValHold();
v =vh;
//System.out.println(v.i);
System.out.println(v.i);
}
public static void main(String[] argv){
ObParm o = new ObParm();
o.amethod();
}
}就是先后顺序不一样
谢谢!
你这个程序出来的结果跟LZ的结果不一样
你的是
20
10
程序执行another(V)
调用another方法,在another里面,先执行v.i = 20 ,这里的v是传递的参数,它指向先前定义的v,然后
ValHold vh = new ValHold();
v =vh;
System.out.println(v.i);
此时的v 已经指向vh,是another里面的局部变量,而vh是新的实例,故输出10
然后程序返回到
public void amethod(){
ValHold v = new ValHold();
another(v);
System.out.println(v.i);
}继续执行输出,而此时的v.i已被another改变 值为20
class ValHold{
public int i = 10;
}public class ObParm{
public void amethod(){
ValHold v = new ValHold();
another(v);
System.out.println(v.i);
} public void another(ValHold v){
v.i = 20;
ValHold vh = new ValHold();
v =vh;
System.out.println(v.i);
} public static void main(String[] argv){
ObParm o = new ObParm();
o.amethod();
}
}
引用就类似于C语言中的指针。
方法amethod()中 new ValHold()在内存中声请了内存空间并把地址值赋给了应用 v ,用v.i值是10,接下来调用方法another(v)参数是对象实列,同时方法 another(ValHold v)的实现用的参数和amethod()的引用相同,很容易让人迷惑,但是another(ValHold v)中的v只是一个局部的变量而已。不妨都改成vt,结果是一样的。方法another(ValHold v)中。v.i=20改变了方法amethod()中v引用的内容。ValHold vh = new ValHold(); v =vh;使局部变量v指向了新的引用vh。所以v.i就是10,当调用退出以后,amethod()中的v不变,所以v.i=20,而不是10,因为在调用方法时候已经被改变了。
现改程序如下:
class ValHold{
public int i = 10;
}
public class ObParm {
public void amethod(){
ValHold v = new ValHold();
another(v);
System.out.println(v.i);
} public ValHold another(ValHold vt){
vt.i = 20;
ValHold vh = new ValHold();
vt =vh;
System.out.println(vt.i);
return vt;
} public static void main(String[] argv){
ObParm o = new ObParm();
o.amethod();
}
}
结果一样