作者:熔岩
日期:2007-03-25
MSN :[email]leizhimin@126.com[/email]
声明:原创作品,未经授权,谢绝转载!
 
哈哈,是1还是2?
 
这是湖北一个MM问我的问题,主要是问方法中对象是否会通过方法改变。
我给她了个例子,大家说说会输出什么。呵呵,我暂时不公布答案了。。
 
public class Test{
    public int a=1;
    public static void main(String args[]){
        Test x=new Test();       
        System.out.println(new Test().test(x).a);
    }
    public Test test(Test t){
        t.a=2;
        return t;
    }
}
 
在网友ZJ回复的帖子基础上继续扩展了一下本例子:
 
public class Test{
  public int a=1;
  public static void main(String args[]){
    Test x=new Test();
    System.out.println("x.a="+x.a);
    System.out.println(new Test().test(x).a);
    System.out.println("x.a="+x.a);
    System.out.println(new Test().change(9).a);//一个新对象产生了
    System.out.println("x.a="+x.a);
    System.out.println("y="+new Test().change1(11));
    System.out.println(x.change1(x.change1(22)));
  }
  //修改对象成员a后并返回该对象
  public Test test(Test t){
    t.a=2;
    return t;
  }
  //修改当前对象自身成员a并返回当前对象
  public Test change(int i){
       this.a=i;
       return this;
  }
  //强行修改参数变量的值
  public int change1(int y){
      //System.out.println(y);
      y=88;
      //System.out.println(y);
      return y;
  }
  //强行修改参数变量的值
  public int change2(final int z){
      // y=88;    --不可执行,因为参数是final类型的,不让修改。
      System.out.println(z);
      return z;
  }
}
 
 
说名:函数参数中的基本类型变量的值是可以修改的,函数中的参数值有效范围在就是整个函数体,在函数执行结束后,整个参数的生命周期也就over了。所以对其修改后,起作用的仅仅在函数声明周期内有效,但是函数有能力把这个修改后的值返回。
 
网友ZJ在例子中使用了一个this变量,实际上:
System.out.println(new Test().change(9).a);//一个新对象产生了
里面使用的是新对象了,不再是x这个对象了,这个对象是匿名对象,而change函数中的this在这个语句里面就指代这个当前匿名对象,所以这个对象的修改不会引起x对象的改变。
 
总结从这个例子中,我觉得不要从传质传引用的角度来理解。不然有人会说,那基本类型参数变量y值也改变成88了!呵呵,那究竟应该怎么来理解呢?其实只要大家明白,一个对象就是一块内存,对象变量就是用来表示这块内存地址用的。当这个变量没有初始化的时候,这个对象变量就没有表示任何内存地址,其实就是null。当通过这个对象变量修改了对象成员后,这个对象的内存也就相应的被改动过了,整个对象当然变化了。
 
如果基本类型变量,变量直接指代一块内存(不同类型的基本类型变量分配的内存大小是有差异),这个块内存就用来存储变量的值,你给什么就是什么。函数参数中变量y,实际上已经又“偷偷定义了”一个临时变量,这个变量值也是可以改变的,你给什么它就是什么,你可以反复为它赋新值(int i++反复执行不会出错的原因就在于此),但是出了函数体外,就无效了。这实际上就是网友ZJ所谓的“传值”的真正含义!
 
另外,如果函数基本类型参数设为final,那么编译器不让修改其值。有兴趣大家可以试试。
 
再次感谢ZJ的回帖,也激发我的和大家交流的欲望。。。。。