繁体   English   中英

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

[英]Why I cannot increment integer in void method

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

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

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

可能很简单的问题,但我看不到

Java通过值传递参数。

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

有关更多详细说明,请参见此问题

这是因为您使用的是原始整数,实际上是将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++;
}

当然,如果您要传递对象,那么您是通过引用传递的,因此您可以进行变异而无需返回。

如果你想工作。 您需要包装类似以下的类:

class MyInt {
   int i;
}

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

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

这不是一个好习惯,这只是让您知道,好方法吗? 你把一个setter和getter并执行以下操作

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

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

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

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

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

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

这里将详细讨论该问题: Java是“按引用传递”还是“按值传递”? 在这里http://javadude.com/articles/passbyvalue.htm (这是我发现的最好的解释)。

简而言之,如果您不想编写任何内容,则AtomicInteger类可能会有所帮助。

大声笑...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM