您好我在堆栈溢出时阅读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。
有人可以解释一下吗?
答案 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);