日期:2014-05-18  浏览次数:20658 次

疑惑的一段程序,请大狭门给我解惑!
public   class   scjp   {

/**
  *   @param   args
  */

public   static   void   add   (Integer   i){

int   val   =i.intValue();
val   +=   3   ;
i   =   new   Integer(val);
System.out.println(i);

     
}

public   static   void   main(String[]   args)   {
//   TODO   自动生成方法存根

Integer   i   =   new   Integer(0)   ;
add(i);
System.out.println(i.intValue());


}

}
为什么打印出来的是3
                                    0
而不是3
            3


------解决方案--------------------
public static void main(String[] args) {
// TODO 自动生成方法存根

Integer i = new Integer(0) ;
add(i);
System.out.println(i.intValue());
在这个方法里,i只被认为是Integer(0)的一个实例化对象,至于它被当作参数传入到add方法中,在这里被认为对下面的打印调用是不能造成影响的,所以System.out.println(i.intValue())里的i实际上还是Integer i = new Integer(0) 里的对象~~~~所以打出来的是0
------解决方案--------------------
在add方法中的i,生命周期在add范围内,出了add方法,它就消亡了,不会影响main方法中的i
------解决方案--------------------
这个是属于传值调用的,是java基础中以个比较难理解的地方.
i在传到这个方法中后它原来的值并没有改变还是0
public static void add (Integer i)
而i在传如这个方法后val += 3 ;
i = new Integer(val);
System.out.println(i);
它在先执行就输出了3
public static void add (Integer i){

int val =i.intValue();
val += 3 ;
i = new Integer(val);
System.out.println(i);


}
在执行最后的那个方法,由于它原来的值没有改变所以输出的是0