A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王小刚 中级黑马   /  2012-3-28 20:49  /  2691 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我用电脑是找到结果了,但是完全搞不清,感觉很晕...
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);
        System.out.print( v.i );
    }
    public void another(ValHold v, int i){
        i=0;
        v.i = 20;
        ValHold vh = new ValHold();
        v =  vh;
        System.out.print(v.i);
        System.out.print(i);
   }
}
  求详细解释!

6 个回复

倒序浏览
运行结果应该是10,0,20
主函数中o.amethod();调用了amethod()方法,在amethod()方法中 another(v,i);调用了another函数

这里具体看一下another()函数中的内容
v.i = 20;//将传来的v 对象的i属性值赋为20
ValHold vh = new ValHold();//此处新创建了一个 VallHold对象
v = vh;//将 vh 赋值给v
然后是第一个输出语句 System.out.print(v.i); 这里等同于 System.out.print(vh.i);
打印的是 vh对象中 i属性的值,10
接着是第二个输入语句:System.out.print(i);
这里i之前没有对象调用,默认输出的是another函数中的局部变量i ,也就是0
然后执行amethod()中的 System.out.print( v.i );
此时v中的i属性已经在another中赋为20,因此打印最后一个输出值为20

回复 使用道具 举报
public static void main(String argv[]){
                 Test3 o = new Test3();
                o.amethod();
            }
            public void amethod(){
                int i = 99;
                ValHold v = new ValHold();
                v.i=30;
                another(v,i);                                                       
                System.out.println( v.i );                                //在another(v,i)中v指向的i已被重新赋值,20.
                                                                                                //第三个输出值,v.i为20.
            }
            public void another(ValHold v, int i){
                i=0;
                v.i = 20;                                                                //给对象属性赋值
                ValHold vh = new ValHold();                                //创建新的ValHold对象,此时vh.i=10.
                v =  vh;                                                                //将vh的索引地址付给v
                System.out.println(v.i);                                //第一个输出值,v.i及时vh.i是10.
                System.out.println(i);                                        //第二个输出值,i是局部变量,为0.
           }

建议lz把print()都改成println(),这样结果便于观察
回复 使用道具 举报
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); //此时传递进去的v对象中的i=30,传递的int型i=99
        System.out.print( v.i ); //此时应该打印的是30
    }
    public void another(ValHold v, int i){
        i=0;//i从99变成0
        v.i = 20; //此时v中的int i从30变成20
        ValHold vh = new ValHold();
        v =  vh;
        System.out.print(v.i); //此时的i应该为10
        System.out.print(i); //这个i应该为0
   }
}
个人分析,应该没问题。。
回复 使用道具 举报
本帖最后由 鲍亚坤 于 2012-3-28 21:26 编辑

其实就是语句执行,赋值问题,理理思路就行了。。
  1. class ValHold{
  2.          public int i = 10;
  3. }
  4. public class ObParm{
  5.      public static void main(String argv[]){
  6.          ObParm o = new ObParm();//创建ObParm对象
  7.          o.amethod();//调用amethod()方法
  8.      }
  9.      public void amethod(){
  10.          int i = 99;//定义局部变量i
  11.          ValHold v = new ValHold();//创建ValHold()对象
  12.          v.i=30;//给ValHold中的i赋值i=30
  13.          another(v,i);//调用another方法,将v对象,和i=99作为参数
  14.          System.out.print( v.i );//输出ValHold类中的i值,20
  15.      }
  16.     public void another(ValHold v, int i){
  17.          i=0;//将参数i赋值为0
  18.          v.i = 20;//给ValHold类中的i值为 20
  19.          ValHold vh = new ValHold();//创建新的ValHold对象vh
  20.          v =  vh;//将对象vh赋值给对象v  此时v.i的值为10
  21.          System.out.print(v.i);//输出v对象里i的值 10
  22.          System.out.print(i);//输出当前方法中i的值 0
  23.     }
  24. }
复制代码
最后输出结果10020
回复 使用道具 举报
class ValHold{
        public int i = 10;
}
public class ObParm{
    public static void main(String argv[]){
        ObParm o = new ObParm();
        o.amethod();                                            //1  调用amethod()
    }
    public void amethod(){
        int i = 99;            
        ValHold v = new ValHold();
        v.i=30;
        another(v,i);                             // 2 调用another() 此时 i=99  v.i=30    程序转到another()方法中并执行完
        System.out.print( v.i );               //3   由 another中的(2)可知 v.i = 20                               最后输出20
    }  
    public void another(ValHold v, int i){               //3  v = new ValHold(),99 传进来
        i=0;                                (1)         i = 99 变成 i=0;
        v.i = 20;                                    (2) v.i=30 变成 v.i=20;
        ValHold vh = new ValHold();
        v =  vh;                                      (3) 把v的引用重新指向新的ValHold对象 即vh对象
        System.out.print(v.i);            (4) 这里的v.i 就是 vh.i  而vh对象没有给i改变值 所以是10          即现输出 10
        System.out.print(i);           (5) 由(1)  可知   i=0                                                     再输出   0
   }
}
所以最终结果是  10  0  20
回复 使用道具 举报
方江 中级黑马 2012-3-29 09:05:10
7#
楼上借点分用一下,这代码还是有几个单词看不懂。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马