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
谢谢!!

解决方案 »

  1.   

    晕~很简单,i是实例变量,调用 another(ValHold v)方法改变了对象v的属性i的值了~
    所以是20;新new的对象vh的属性i却没有被重新赋值,所以是10;
      

  2.   

    another(v);输出10,因为v=vh,改变了值
    System.out.println(v.i);输出20,因为这是原来的i
      

  3.   

    1.public void another(ValHold v){
        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了!
      

  4.   

    i是实例变量,调用 another(ValHold v)方法改变了对象v的属性i的值了~
    所以是20;新new的对象vh的属性i却没有被重新赋值,所以是10;
      

  5.   

    先输出的是another()结果,然后再输出amethod()结果。
    首选要知道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值
      

  6.   

    class ValHold{ 
      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();
      }
    }其实的你代码跟这个一样的,这样看不是就很明白了
      

  7.   

    错了应该是这样:
    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();
      }
    }就是先后顺序不一样
      

  8.   

    先谢谢各位了,我还有点不明白,明明这句v =vh,使v指向了新的对象vh,那为什么最后还输出20啊,我觉得因该跟vh的对象一样啊,输出10,本人很菜,望不吝赐教!
    谢谢!
      

  9.   

    <<thinking in java>>(3rd)里面的附录A专门介绍这方面的,楼主去看看。参与有分哈!!!
      

  10.   

    to sheep219 
    你这个程序出来的结果跟LZ的结果不一样
    你的是
    20
    10
      

  11.   

    我的理解:
    程序执行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
      

  12.   

    发表我看法:JAVA只“按值”传送自变量,方法的调用不会改变自变量的值,当对象实列做自变量传送方法时,自变量的值是对对象的引用,就是说传给方法的是引用值,方法内这个引用值不会被改变,但是可以修改该引用指向的对象内容,所以当从方法中退出时,修改的对象可以保存下来,而引用值不改变。
    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();
        }
    }
    结果一样