为什么我不能在void方法中增加整数

时间:2012-02-09 14:35:55

标签: java

我真的很困惑为什么在这个小例子i仍然是0:

public static void main(String[] args) {
    int i = 0;
    inc(i);
    System.out.println(i);
}

private static void inc(int i) {
    i++;
}

可能非常简单的问题,但我没有看到它

5 个答案:

答案 0 :(得分:11)

Java按值传递参数。

因此方法i中的inc实际上只是i方法中“原始”main副本。您递增该副本,但这对外部的原始变量i没有影响。

有关更详细的说明,请参阅this question

答案 1 :(得分:3)

这是因为您使用的是原始整数,实际上您将i的值传递给inc而不是i的引用。在这种情况下,只需从inc方法返回一个值:

public static void main(String[] args) {
    inc i = 0;
    i = inc(i);
    System.out.println(i);
}

private static int inc(int i) {
    return i++;
}

当然,如果你正在传递物体,那么你就是通过引用传递的,所以你可以在不返回的情况下进行变异。

答案 2 :(得分:1)

如果你想工作。您需要包含如下所示的类:

class MyInt {
   int i;
}

然后你继续将MyInt的对象传递给“inc”函数。您将在其中执行以下操作:

    private static void inc(MyInt myInt){
      myInt.i++;
    }

不是一个很好的练习,这只是为了让你知道,好方法?你把一个二传手和吸气器做了以下

myInt.setI(myInt.getI() + 1);

答案 3 :(得分:0)

i的值作为副本传递给inc()方法,因此原始int i不会更新。

原始参数作为VALUE副本传递给方法。

对象参数作为REFERENCE的VALUE副本传递给对象。

答案 4 :(得分:0)

您要做的是通过引用传递参数,这在Java中是不可能的。

在Java参数中,通常是通过值传递的引用。对于本机类型,您可以假设它们是按值传递的。

这个问题在这里详细讨论:Is Java "pass-by-reference" or "pass-by-value"?http://javadude.com/articles/passbyvalue.htm(这是我发现的最佳解释)。