如何在java中实现int in / out params

时间:2011-12-02 11:08:12

标签: java

抱怨这样一个原始问题。

我写了一个带有一个参数的函数;这个参数应该是一个输入/输出参数。

经过调试,我意识到,由于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这让我更加困惑。

6 个答案:

答案 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中按值传递。使用对象时,将传递对象的引用,并通过值传递:引用的副本并传递给方法。如果为传递的引用指定了某些内容,则将其指定给副本,因此原始引用仍然指向原始对象。