1: public class AClass{ 
2:   public int value; 
3:   public AClass(int value){ 
4:     this.value = value; 
5:   } 
6: } 
01: public class Main { 
02:   private void modify1(AClass object){ 
03:     object.value = 15; 
04:   } 
05:  
06:   private void modify2(AClass object){ 
07:     object = new AClass(20); 
08:   } 
09:      
10:   private AClass modify3(){ 
11:     return new AClass(25); 
12:   } 
13:  
14:   public static void main (String args[]) { 
15:     Main main = new Main(); 
16:     AClass object = new AClass(10); 
17:      
18:     System.out.print(object.value); 
19:     main.modify1(object); 
20:     System.out.print (object.value); 
21:     main.modify2(object); 
22:     System.out.print(object.value); 
23:     object = main.modify3(); 
24:     System.out.print(object.value); 
25:   } 
26: } 谁能帮我添下注释,解释下为什么它会输出:  10151525 
重点是这里的modify1,2,3和object的关系还有作用域。

解决方案 »

  1.   

       可能你的问题是:modify2()得出的值等于15,而不等于20,所以我只针对这里说下看法。
    关于java数据传递方式,从术语上定义,我倾向于pass by value:
       a.对于基本数据类型数据,取得的是数据的局域副本;
       b.对于对象,取得的是传递的refference的局域副本,同时产生别名(局域副本也指向refference
    指向的那个对象)。
       解释modify2()得出的值等于15,而不等于20:   
    取得的是局域副本(refference),所以我们操作的东西就是这个refference,与“原本”毫无关系,
    refference也需要存储空间,它的值为指向哪个对象,现在我们可以修改它本的值,让它指向其它对象,
    modify2正是这样做的。
       modify1的情况不说也很明白了。
       
      

  2.   


    把所有的方法形参都改下名字,就好理解了private void modify2(AClass o){ 
         o = new AClass(20); 
    } 现在:AClass object = new AClass(10); 
    这时生成一个AClass对象(例如对象ID=20),
    那么object就是这个对象的一个引用,也可以说,这个ID=20的对象的名字(在main方法的范围)现在叫object;然后
    private void modify1(AClass o){ 
        o.value = 15; 

    main.modify1(object); 
    object传给了方法modify1,那么,也就是o=object,也就是,在modify1方法中,ID=20这个对象的名字叫 o;
    o.value = 15; 那么,也就是,o的属性value(也就是ID=20的对象的属性value)赋新值15;再来看
    private void modify2(AClass o){ 
         o = new AClass(20); 

    main.modify2(object); 还是object传给了方法modify1,那么,也就是o=object,也就是,在modify2方法中,ID=20这个对象的名字叫 o;
    (上面和modify1是一样的,但是,这些都是在o = new AClass(20); 语句之前的状态;)o = new AClass(20); 之后,o这个名字发生了变化,新生成了一个AClass对象(ID=88),然后,这个ID=88的对象“抢夺”了o这个名字,在modify2中,ID=88的对象名字就是o,而原来的ID=20这个对象在modify2方法中已不再有名字;可以理解为,modify2这个方法,只是和ID=20对象开了个玩笑,给他一个名字O,又剥削了这个名字。
    不过,仅此而已,ID=20在modify2中,属性没有产生任何变化,所以,ID=20.value值还是15;
      

  3.   


    private void modify2(AClass o) {
    //o = new AClass(20);
    }也就是相当于在modify2(AClass o)可有可无,这里头的对象O跟外面modify2(AClass o) 这里红色的O的value根本没有关系,不管里边new了什么对象,新对象的value都不会被打印,对吧?
      

  4.   


    private void modify2(AClass o) {
    o = new AClass(20);
    }
    在分解下我的理解 首先 private void modify2(AClass o) 这方法执行了(AClass o),已经打印出了15这个结果 ,后来o = new AClass(20); 这里只是给O重新指定了一个ID,对不对?