3

我意识到,如果我将对象作为函数的参数传递并对其进行更改,则更改会“保留”在对象中。但整数并非如此。

public void start() {
    int x = 100;
    modify(x);
    // I would like x to be 200 now. But it isn't :(
}

public void modify(int y) {
    y *= 2;
}

所以基本上,有没有办法在上面的代码中实现我想要的?是否可以修改这样的整数(如对象引用)?

4

4 回答 4

4

在使用primitives时没有“ reference”的概念。但是您可以通过执行以下操作来实现您想要的:

x = modify(x);可能是代码想要的。

现在x包含modify(x)方法调用的结果。

于 2012-09-24T03:50:05.530 回答
3

你不能这样做。基元按值传递。(引用也是按值传递的。您不能修改对象引用;您只能修改被引用的对象。)您能做的最好的事情是:

public void start() {
    int [] x = {100};
    modify(x);
    // x[0] is now 200 :)
}

public void modify(int []y) {
    y[0] *= 2;
}

数组引用x是按值传递的,但您可以修改数组元素。请注意,传递 anInteger无济于事,因为Integer对象是不可变的。

或者,您可以重新设计您的方法以返回双倍值并在调用代码中分配它(如Nambari 建议的那样)。

于 2012-09-24T03:51:01.900 回答
2

除了传递数组使用返回值之外,第三种可能性是使用ValueHoldergetter 和 setter传递某个类的对象:

public class IntValueHolder
{
    private int value;
    public int getValue()
    {
        return this.value;
    }
    public void setValue(final int value)
    {
        this.value = value;
    }
}

这在技术上与传递数组非常相似,但恕我直言,它更简洁一些,即它更好地描述了您的意图。

于 2012-09-24T04:17:12.447 回答
0

您可以做的一件事是获取 modify() 方法的返回值并将其分配给变量,如下所示。

public void start() {
    int x = 100;
    x=modify(x);   
}

public int modify(int y) {
    return y *= 2;
}
于 2012-09-24T04:08:33.243 回答