抱怨这样一个原始问题。
我写了一个带有一个参数的函数;这个参数应该是一个输入/输出参数。
经过调试,我意识到,由于java中没有显式的引用类型,我应该使用Integer对象(而不是int primitive)作为参数类型。所以我改变了我的功能:
boolean getNextFoo(int currentFoo) {
currentFoo = currentFoo + 1;
}
为:
boolean getNextFoo(Integer currentFoo) {
currentFoo = currentFoo + 1;
}
在调试器中检查执行后,我意识到这与前面的结果相同。也就是说,我传入getNextFoo()
的对象不会改变。
问题1 :如何使用Java实现输入/输出参数(更具体地说,用于基本类型)。我想(请原谅我)对象总是通过引用传递。
问题2 :我正在网上查询答案,并读到Integer是不可变的。我理解不变的意思是不变的。如果是这样,为什么编译器(解释器?)在我currentFoo = currentFoo + 1
函数内getNextFoo
时会抱怨?
PS :我在调试器中看到实际上没有将Integer对象传递给getNextFoo
,而是将Integer.valueOf
的值传递给getNextFoo
这让我更加困惑。
答案 0 :(得分:2)
Q1 :Java中的参数始终按值传递。对于对象,您传递引用的值,而不是引用本身(这通常是混淆的原因)。要实现输入/输出参数,您必须传递一个包含对真实参数的引用的对象。
Q2 :immutable意味着对象无法修改,但变量可以。所以currentFoo = currentFoo + 1
表示:创建一个值为currentFoo + 1的新Integer,然后将这个新对象赋给currentFoo。
答案 1 :(得分:1)
答案1:
一种方法是传入AtomicInteger
, 可变。
boolean getNextFoo(AtomicInteger foo) {
foo.set(foo.get() + 1);
return true;
}
答案2:
声明:currentFoo = currentFoo + 1
未修改对象;它正在创建新的整数实例并重新分配本地参考以指向它。
当你退出方法时,本地引用会“丢失”(即它超出范围),因此重新分配它在方法之外无效。
答案 2 :(得分:0)
整数是不可变的,这就是为什么它的价值不能改变的原因。
当我执行currentFoo = currentFoo + 1
时,编译器(解释器?)为什么不抱怨因为当你执行 currentFoo = currentFoo + 1 时,会在堆上创建一个新的Integer,并将其引用分配给currentFoo。
对于Integer,如果要在函数外部获得更改值,要么可以从函数返回值, OR 可以将整数放入array / ArrayList并传递该数组/ ArrayList到功能。现在更改值,它将反映在函数外部。
答案 3 :(得分:0)
问题1:如何使用Java实现输入/输出参数(更多 特别是对于原始类型)。我想(原谅我)那个对象 总是通过引用传递。
传递具有类型int
的成员变量的可变类对象,并通过该对象更新成员变量。
问题2:我正在互联网上查询答案并阅读 整数是不可变的。我理解不变的意思是不变的。如果是这样, 当我执行currentFoo时,为什么编译器(解释器?)没有抱怨 getNextFoo函数中的= currentFoo + 1?
将创建新对象,并将其分配给currentFoo
。
答案 4 :(得分:0)
问题2。在处理正在创建的新对象的结果时调用currentFoo = currentFoo + 1
,并将其引用存储在currentFoo
中。编译器没有抱怨,因为它不是无效的Java - 它只会导致创建一个新对象,而不是当前正在更新的对象。
答案 5 :(得分:0)
问题1:
您可以传递1 int的数组,并更改唯一元素值,或传递可变整数包装器对象(例如AtomicInteger
)。或者,您的方法可以返回包含布尔字段和整数字段的对象,而不是使用输入/输出参数。
问题2:
currentFoo = currentFoo + 1
与:
相同int tmp = currentFoo.intValue(); // auto-unboxing
tmp = tmp + 1;
currentFoo = Integer.valueOf(tmp); // auto-boxing
因此将新的Integer实例分配给currentFoo。原始实例(不可变)不会被修改。
所有参数都在Java中按值传递。使用对象时,将传递对象的引用,并通过值传递:引用的副本并传递给方法。如果为传递的引用指定了某些内容,则将其指定给副本,因此原始引用仍然指向原始对象。