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,为什么不是10,10呢?

解决方案 »

  1.   

    在java中非基本类型传递的是引用,也就相当于c中的指针.class ValHold{ 
    public int i = 10;
    }
    public class ObParm{
    public void amethod(){
    ValHold v = new ValHold();
    another(v);
    System.out.println(v.i);//输出被修改的属性20
    }
    public void another(ValHold v){//v指向传递过来的对象(实参)
    v.i = 20;//修改实参对象的属性
    ValHold vh = new ValHold();
    v =vh;//v指向新定义的对象
    System.out.println(v.i);//输出默认值10
    }
    public static void main(String[] argv){
    ObParm o = new ObParm();
    o.amethod();
    }
      

  2.   

    public void another(ValHold v){
    v.i = 20;
    ValHold vh = new ValHold();
    v =vh;
    System.out.println(v.i);
    }
    由于another方法传递的是个对象,所以一旦改变了对象的类成员值,就改变了对象内部的值。
    ValHold vh = new ValHold();
    v =vh;
    此次在引用时,返回的就是改变后的值。
      

  3.   

    可是:
    ValHold v = new ValHold();与
    ValHold vh = new ValHold();v =vh;
    中的v分别是两个不同的对象嘛?
      

  4.   

    还是不是很明白为什么输出是10,20,
    我总觉得应该输出是10,10,因为两次v都是指向一个new VaHold()嘛?
      

  5.   

    public void another(ValHold v){
    v.i = 20;//如果你那样理解的话,那这里修改的数据又谁的呢?
    ValHold vh = new ValHold();
    v =vh;
    System.out.println(v.i);
    }
      

  6.   

    another(v);  只是将引用拷贝了一份而已,指向同一个内存空间 v0v.i = 20;  修改了指向的空间 v0 的变量值v =vh;  修改了引用指向的内存空间,改为指向空间 vh0   为何输出20,就是因为引用是拷贝传递,虽指向内存地址不变,但引用已经是两个咚咚,原amethod()中的v指向并没变化
      

  7.   

    v =vh;  并不改变 amethod() 中的 v 的指向,就是因为引用是拷贝后传递。。你这个 v 跟 amethod() 中的 v 不是同一个!!
      

  8.   

    java传递是引用的拷贝,既不是引用本身,更不是对象
      

  9.   

    jackyzgm说得有道理,
    可惜我没有分给了,不好意思哈。
    下次多给你送分啊?