作为参数传进去的i只是一个引用,执行完i=new Integer(val);之后,方法add3里面的i变成了另一个引用,而main方法里面的i仍是原来的引用,所以值不变

解决方案 »

  1.   

    结果当然是0,请体会下面的代码
    public class Test2 {
    public static Integer add3 (Integer i) {
    int val = i.intValue();
    val += 3;
    return new Integer (val);
    }

    public static void main (String args [ ] ) {
    Integer i = new Integer (0);
    i=add3 (i);
    System.out.println (i.intValue ( ) );
    }
    }
    它打印出来的结果可能就是你想要的,仔细考虑一下:)
      

  2.   

    main中i从前到后一直都没有改变过。add3方法中的i并没有改变main中的i.
    可以改成:
    public static Integer add3 (Integer i) {
    int val = i.intValue();
    val += 3;
    i = new Integer (val);                  return i;
    }
    public static void main (String args [ ] ) {
    Integer i = new Integer (0);
    i = add3 (i);
    System.out.println (i.intValue ( ) );
    }
      

  3.   

    i = new Integer (val);
    问题出在这句上面
      

  4.   

    这个问题知道的时候很简单的,不知道的时候很复杂的。首先我们要明白java中引用的概念。我们假设jvm的内存空间有一个对象(objectA),这个对象程序层面上是不可见的,我们使用引用这个概念来使用这个对象。我们程序提供refA,refB两个引用指向这个对象。当然我们这个时候可以通过refA,refB来处理对象objectA了。
    其次也是最重要的一点,我们可以把引用指向别的对象。比如jvm中还存在一个对象objectB的话,我们也可以使用引用refB指向objectB(本来refB是指向objectA的)。最后,函数传参数的时候,基本类型是传值的,但是其他的都是传引用的。实际上传递是引用的copy(*****注意不是引用指向对象的copy******),所以我针对传入参数操作时,操作的是同一个对象。但是这里理解有一个困难的地方就是,我们只能利用对象的成员函数来操作对象,如果我们对引用重新赋值的话(就是你的例子),引用就不是指向原来那个对象了,所以就达不到你要的效果了。******************************************************
    这里的说明对于String类不适合的,因为String在java中很特殊,
    自己需要了解的话,请自己研究(看jdk原代码)
    ******************************************************
    当你在函数add3()中的一行;
    i = new Integer (val);
    执行以后,实际上i已经是指向内存某处的其他对象了,而不是
    main函数的
    Integer i = new Integer (0);
    的那个i了。
      

  5.   

    是对象作用域的问题。
    参数传进去的是一个引用,在函数add3里面你只是改变了函数里面Integer i对象的值,main里面的Integer i实际上没有改变。这种情况是因为i的类型是Integer,如果i是int类型就会得到你想要的效果了。试一试,下面的代码:public class Test {
      public static void main (String args [ ] ) {
            int i = 2;
            i = add2(i);
            System.out.println (i);
        }
      private static void add2(int i) {
          i += 2;
          System.out.println(i);
      }
    }可以得到你要的结果,这是因为i是int型,是基本的类型。
      

  6.   

    xioyoo(xioyoo) 、gja106(中文字符) 解决方法是一样的,都解决了问题。不过现在你的问题的核心是,可能你认为java和c一样,有传值调用和引用调用。事实上跟你想的不完全一样。想要弄清问题,如果你有《最新java2核心技术 卷I: 原理》的话看看page119我想你会明白的。
      

  7.   

    add3函数定义的是static 并没有返回值,调用后回到主函数中,输出的自然还是0了。
      

  8.   

    再给一种解决办法,对了,这可能不是解决办法,只是说明有关方法参数的问题:public class Test {
    public static void add3 (MyInteger i) {
    int val = i.getValue();
    val += 3;
    i.setValue(val); 
    } public static void main (String args [ ] ) {
    MyInteger i = new MyInteger (0);
    add3 (i);
    System.out.println (i.getValue ( ) );
    }
    }
    class MyInteger  {
    public MyInteger(int value) {
    this.value =value;
    }
    public void setValue(int value) {
    this.value =value;
    }
    public int getValue() {
    return value;
    }
    private int value;
    }