Given:
5. class Payload{
6. private int weight;
7. public Payload (int w){weight = w;}
8. public void setWeight(int w){weight = w;}
9. public String toString(){return Integer.toString(weight);}
10. }
11. public class TestPayload{
12. static void changePayload(Payload p){/* insert code */}
13. public static void main(String[] args){
14. Payload p = new Payload(200);
15. p.setWeight(1024);
16. changePayload(p);
17. System.out.println("p is " + p);
18. }}
Which code fragment, inserted at the end of line 12, produces the output
p is 420?
A. p.setWeight(420);
B. p.changePayload(420);
C. p = new Payload(420);
D. Payload.setWeight(420);
E. p = Payload.setWeight(420);
-----------------------------------------------------------答案是A。A当然对,但为什么C不对呢。 我运行了这个代码,用了p = new Payload(420)在第12行;, 结果打印出了1024。 我觉得12行的p = new Payload(420)应该让p指向了一个新的Payload啊。难道是因为p是参数,所以在这个方法里被复制了? 但是如果是被复制了,为什么p.setWeight(420);却能产生效果?
以前没怎么想过这个问题,还请见笑了

解决方案 »

  1.   

    1、java只有值传递
    2、changePayload(Payload p)中的p在方法执行完就消失,p是局部变量,所以如果在方法内new一个Payload,只是局部变量p指向new出来的对象,外面的那个p还是指向原来的对象,p.setWeight()改变了外面的p,因为此时局部变量的值是从外面传过来的地址值
      

  2.   

    执行NEW之前的局部变量p指向main中的Payload p = new Payload(200);
    执行p = new Payload(420); 
    后,p的指向发生了变化,但是main中的Payload p 并没有变化的。