怎么又问呀 呵呵~~ another 是传引用的 形参和实参v都是指向一个对象 所以在another中 v.i=20修改了实参的对象

解决方案 »

  1.   

    子程序传递参数有两种方式:按值调用和句柄调用。根据传递对象的不同,java分别使用这两种方式:
    当传递简单类型时,是按值传递的。这时跟c中的实参和形参是一个概念,对形参的改变并不影响实参,例如本题中another()的形参int i。
    而对于对象,是按句柄传递的,当把句柄传递给自变量时,自变量与该参数就指向同一个对象,在该方法中对对象的改变将影响作为参数的对象。
      

  2.   

    当然是20啦,怎么会是10呢,哈,在调用another方法的时候,你传的第一个参数是对象啊,another中的v和amethod中的v此时指向同一个区域,所以在another中修改了v.i的值,another中的v自然也变了啊,30自然变成20了啊!记住:java中只有值传递,想要改变某个值,只能通过传递对象来实现.
      

  3.   

    可能是我没有表达清除我的疑点。java什么时候按值传递,什么时候引用传递我是清除的。这里我的疑点在于返回amethod()后照理说v.i应该是在another()中修改好的值,即v.i=10,而实际则是20。
      

  4.   

    java 总是传值。但是java的数据类型分为原始类型和引用类型像类、接口、数组都是引用类型所以它们本身就是引用。
      

  5.   

    这是个很不错的问题啊!
    我在考SCJP时,就遇到这样类似的问题.楼上的各位所得都不错.好好看看
    因为another()方法中所修改的是局部变量的值,返回后自然就没有了--如果这个还不明白,查看一下书,看看局部变量和方法变量在内存中的存放形式.怎么索引局部变量,然后,你就可以明白了----真正的明白了!!
    another()中得值只在another(){}内有效----它所修改的值相当于v.i的一个复制
    的值,而不是v.i本身!!
      

  6.   

    to azhiking(雪域浪人) :
       你可以把如下两行注释掉,看看结果和你想的是否一致
       
       ValHold vh = new ValHold();
       v =  vh;这道题重点考的就是这两行.........
      

  7.   

    关键在于java中对于对象所谓的引用调用其实是拷贝了对象的地址,
    也就是说:
      当在amethod方法中new了一个ValHold类的实例(v)时,
    系统在内存中分配了一块地址给v,设地址为a,
    在调用another前,a地址所指的对象v的i=30,
    调用another时,系统拷贝了地址a,设为b,即a,b都
    指向对象v,即是说在another中访问对象v是通过b,
    接下来v.i=20,即通过b访问到v,把i的值改为20,此时v.i=20,
    关键在于ValHold vh =new ValHold(),
    和v=vh,前者新分配了一个对象vh,他的i值为10,
    内存中地址为c;v=vh等价于b=c,就是把原本指向
    对象v的地址b的值改为对象vh的地址,
    此时b不指向v,而指向vh,此时v.i=20,vh.i=10。
    下一句输出v.i其实是输出此时vh.i,等于10,
    然后返回到amethod,输出v.i其实是输出此时v.i,
    等于20。