参考和价值混淆

时间:2012-10-03 03:31:16

标签: java reference

您好我在堆栈溢出时阅读this问题,并尝试做一个示例。

我有以下代码:

public static void main(String[] args){
     int i = 5;
     Integer I = new Integer(5);

     increasePrimitive(i);
     increaseObject(I);

     System.out.println(i); //Prints 5 - correct
     System.out.println(I); //Still prints 5
     System.out.println(increaseObject2(I)); //Still prints 5

}

public static void increasePrimitive(int n){
     n++;
}

public static void increaseObject(Integer n){
     n++;
}

public static int increaseObject2(Integer n){
         return n++; 
}

increaseObject打印5是否因为引用值在该函数内发生了变化?我对吗? 我很困惑为什么increasedObject2打印5而不是6。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

increasedObject2()函数中,

  

return n ++;

是后缀。因此,在n = 5之后,它会增加n值,即n = 6.

答案 1 :(得分:1)

问题是return n++;,其中返回n,然后才增加。如果您将其更改为return ++n;return n+1;

,它会按预期工作

但是,您尝试测试的内容仍然无法与Integer一起使用,因为它是不可变的。你应该尝试像 -

这样的东西
class MyInteger {
     public int value; //this is just for testing, usually it should be private

     public MyInteger(int value) {
         this.value = value;
     }
}

这是可变的。

然后,你可以传递对该类实例的引用,并从调用的方法中改变它(在该实例中更改value的值)。

更改方法 -

public static void increaseObject(MyInteger n){
     n.value++;
}

并称之为 -

MyInteger i = new MyInteger(5);    
increaseObject(i);