小可是一菜鸟。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);             //输出10 0
              System.out.println(v.i);  //输出20
      } 
      public void another(ValHold v, int i){ 
              i=0; 
              v.i = 20;                 //v.i改为20,此时another外的v.i也为20
              ValHold vh = new ValHold(); 
              v =  vh;                  //method another中的v.i为10
              System.out.println(v.i+ " "+i); //输出10 0
      } 

解决方案 »

  1.   

    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);            //输出10 0
                  System.out.println(v.i);  //输出20
          } 
          public void another(ValHold v, int i){ 
                  i=0; 
                  v.i = 20;                //v.i改为20,此时another外的v.i也为20
                  ValHold vh = new ValHold(); 
                  v =  vh;                  //method another中的v.i为10
                  System.out.println(v.i+ " "+i); //输出10 0
          }   
          /*object vh out of scope*/

      

  2.   

    呵呵,一道scjp的题10 0 
    20
      

  3.   

    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);//another函数返回后v.i=20(被vh改变了), 这里的局部变量的i是99
          System.out.println(v.i); 
         } 
         public void another(ValHold v, int i)
         { 
                  i=0; 
                  v.i = 20; 
                  ValHold vh = new ValHold(); 
                  v =  vh; //v.i=vh.i=10, 
                  System.out.println(v.i+ " "+i); //v.i=10, i是局部变量0
          } 

    提醒:局部变量的值是优先于全局变量和类成员变量
    如:
    class A
    {
      private int i;
      public A(int i)
      { i++;//这里的i是局部变量
        this.i = i;//这里的i也是局部变量,即从参数传过来的,类A的i要通过特定对象来指出。
       }
    }
      

  4.   

    结果是
    10 0
    20
    原因是java语言在将对象作为参数传入时,仅是在内存中复制了一个变量指向这个对象,然后将这个复制了的对象传入;所以在方法内对此传入对象属性的修改实际上是对原对象的修改;但是,在方法内对此传入对象的重定向并不能改变该对象的指向!E-农民说说俺说的对不对?