public class LostMessage {
public static void add3(Integer i ){
int val =i.intValue();
val+=3;
i=new Integer(val);
}

public static void main(String[] nnnn){
 Integer i = new Integer(0);
 add3(i);
 
  System.out.print(i.intValue());
  
  }
} 请问这段代码输出的是0,还是3? 为什么? 对象作为参数传递的不是句柄马?可最后结果为什么是这样呢?请高手解答,谢谢

解决方案 »

  1.   

    add3(i);这个方法什么都没返回,main中的对象i是没有变化的
      

  2.   

    public static void add3(Integer i ){
    int val =i.intValue();
    val+=3;
    i=new Integer(val);
    }
    你把 i 传给这个方法 传的是这个应用的拷贝 也就是说 引用是传值的你在方法里面改变这个引用的指向的具体对象 外面的 i 肯定不会受影响受影响的只是方法里面的 局部变量 i 指向了新的对象
      

  3.   

    public static void add3(Integer i ){
    int val =i.intValue();
    val+=3;
    i=new Integer(val);
    //这里i已经指向了一个新的对象,不再是原来的对象,但是在main中的Integer i并不会指向新的对象,所以main中的i仍然是旧的
    }
      

  4.   

    Integer i = new Integer(0); 
    为0,
    方法中的i=new Integer(val);,不会返回  System.out.print(i.intValue());
    好象 是
      

  5.   

    我好像记得,java里传对象,传的是引用把,不是传的值
    -----------------------------------------------------
      

  6.   

    当然是零了,
    Java基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的
    Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数,而原对象的值
    不是会改变的.
      

  7.   

    答案是0
    1。要理解JAVA是值传递,对于基本类型(int,byte...) ,String 类,引用变量传递的是副本不会因为调用方法的改变而改变
    2.但是一个引用变量的属性是可以改变的例如:1.public class Test{

    2.public static void main (String [] args) {

    3.StringBuffer a = new StringBuffer ("A");4.StringBuffer b = new StringBuffer ("B");
     
    5.operate (a,b);
     
    6.System.out.println(a + "," +b);
     
    7.}
       
    8. static void operate (StringBuffer x, StringBuffer y) {
       
    9. y.append(x);10.x=new StringBuffer();11. }
     
    12. }这到题的答案是The code compiles and prints “A, BA” y 的内容发生了改变在y.append(x)中
    而x还是引用变量,没有做任何的改变那么输出的结果还是A不会发生变化要记住的是引用变量不会发生改变,他中间的属性和内容才会改变,在你的程序里面因为传递的是个Integer引用变量那么它调用的是副本,它不会影响到返回实参i的值,那么当你在main函数调用i的时候还是原来为0的那个值所有最后答案是0 ,这是我的理解希望对你有帮助
      

  8.   

    如果你把
      i = new Integer(val);
    改成
      i.setValue(val);
    就可以在 main() 中输出 3 了。不过很可惜,Integer 是一个 immutable object,不能改里面的值,所以不存在 setValue() 这样的方法……
      

  9.   

    可以改变被引用对象的field value ,但不可以改变该引用的指方.
      

  10.   

    真的是语法游戏哦 两个i的作用范围分别是在各自的函数体内   调用的add3方法没有返回值  main方法中的i还是0 
    所以 输出是0
      

  11.   

    告诉你一个决窍:在JAVA中,基本类型(int,char,boolean等),包括基本类型的类(Integer,character,Boolean,String等,)在函数参数传递当中传递的都是值。其他非基本类型类传递的都是引用。不信你可以自己试一下。如此解释不知道你满不满意?有多少分给我多少吧!  *^_^*
      

  12.   

    > 在JAVA中,基本类型(int,char,boolean等),包括基本类型的类
    > (Integer,character,Boolean,String等,)在函数参数传递当中
    > 传递的都是值。其他非基本类型类传递的都是引用。“其他非基本类型类传递的都是引用”这种说法容易引起误解。我不是说这个说法是错误的,只是容易引起误解。对于“参数”,我们都知道“形参”和“实参”。Java 中,形参是一个变量,它保存着指向某个 Object 的引用;在参数传递过程中,传过去的是“形参的值”(所以有人说 Java 是“值传递”),也就是“对实际 Object 的引用”(所以有人说 Java 是“引用传递”)。对于实参来说,它得到的是“对实际 Object 的引用”,也就是“形参的值”,但决不是“对形参的引用”。想必大家都知道那个经典的争论吧:“Java 的方法调用是值传递还是引用传递?”其实争来争去,只是文字上的误会而已。在 C/C++ 中,所谓“引用传递”其实是指“对形参的引用”,通过这种形式,可以做到“在函数体内通过修改实参的值,实现对形参的值的修改”。而在 Java 中,这是做不到的,只能做到修改“实际 Object 的值”而已。扯远了,回到楼主这个问题,由于“实际的 Object”碰巧是一个 immutable object,所以,连它的值也是修改不了的。
      

  13.   

    $ zz╭ ╮╭ ﹌╮.       $
    $   z(o-.-o)(o-.-o) .      $
    $ ┏~﹊︸ ̄~﹊︸ ̄~┓      $
    $ IT者-IT开发者的网站--    $
    $ 10万篇技术资料--天天更新 $
    $ -----www.itzhe.cn-----   $
      

  14.   

    > 在JAVA中,基本类型(int,char,boolean等),包括基本类型的类
    > (Integer,character,Boolean,String等,)在函数参数传递当中
    > 传递的都是值。其他非基本类型类传递的都是引用
    言简意赅!!
    可以这样改:
    public class LostMessage {
    public static Integer add3(Integer i ){
    int val=i.intValue();
    val+=3;
    Integer i2=new Integer(val);
    return i2;
    }public static void main(String[] nnnn){
     Integer i = new Integer(0);
     
       i=add3(i);
     
      System.out.print(i.intValue());
      
      }
    } 打印出来就是3了。
      

  15.   

    答案是0  因为i=new Integer(val); 这一句为他创造了一个新的引用,原来的引用不变,所以还是0
      

  16.   

    我觉得这个程序包含了两个严重的语法错误:
    1,基本数据类型(其中有integer)按值传递;
    2,在方法中用了new操作符就说明创建了另一个对象的引用,而你改变的只是这个新引用的值,原来的不变。这是我专门写来验证我的话的:
    public class refer {
    public  static void main(String  arg[]){
      byte[] a=new byte[3];    
      IP(a);for(int i=0;i<3;i++)
    System.out.print(a[0]);
    }public static void IP(byte[] b){// b=new byte[3];
    for(int i=0;i<3;i++)
      b[i]=1;
    }
    }“//”加上打印结果是111,去掉就是000。不信你试!
      

  17.   

    谢谢这么多人的留言,可是到底谁说的对阿,Integer也属于基本类型马?我水平不高,希望来个权威的高手高手高高手做一番结案陈词谢谢
      

  18.   

    Integer 不属于基本类型基本类型只有char ,int,float, double, long。其他的全部都不是基本类型。基本类型的特点就是没有方法。
    比如
    int i=10;
    i.method(); 没有这样的东西
    但是Integer 就不同合理
    Integer i= new Integer (10);
    i.intValue(); 这个却是可以的。
      

  19.   

    对不起,可能我误导你了。其实是这样的:因为java类库设计成完全面向对象模式,很多地方需要对象作为参数和返回值等,所有每一个基本类型都有一个“包装类”。Integer就是int的包装类,答案满意吗?